Skip to content

DX11 rendering backend with FFP shader emulation#125

Open
dasfew2121 wants to merge 39 commits intod1str4ught:mainfrom
dasfew2121:dx11-rendering-backend
Open

DX11 rendering backend with FFP shader emulation#125
dasfew2121 wants to merge 39 commits intod1str4ught:mainfrom
dasfew2121:dx11-rendering-backend

Conversation

@dasfew2121
Copy link

Summary

  • Implement complete DX11 rendering pipeline alongside existing DX9 backend (DX11 as primary renderer, DX9 on hidden 1x1 dummy window for state tracking)
  • Add FFP shader emulation (8 HLSL variants: PDT, PT, PD, PNT, TL, TL2, PDST, PDST2), DX9→DX11 state cache, post-processing pipeline (bloom + tone-mapping), and DX11 shadow map infrastructure
  • Fix 6 rendering bugs: buffer mirroring pool check, debug clear overwrite, wrong RT clearing, gated RT setup, missing frame state reset, viewport desync

Test plan

  • Build succeeds in Release configuration (verified locally, 0 errors)
  • Client launches and renders the login screen via DX11
  • In-game 3D scene renders correctly (geometry, textures, UI, lighting)
  • Post-processing (bloom/tone-mapping) renders correctly
  • Viewport changes (e.g. minimap, UI panels) display correctly
  • SpeedTree vegetation renders (buffer mirroring fix)

🤖 Generated with Claude Code

endi0722 added 30 commits March 2, 2026 22:39
…) and migration docs

- Created GrpMathCompat.h (785 lines) with drop-in D3DX math replacements
  using DirectXMath: D3DXMATRIX, D3DXVECTOR2/3/4, D3DXQUATERNION, D3DXCOLOR,
  D3DXPLANE, all math functions, and ID3DXMatrixStack replacement
- Created DX11_MIGRATION_LOG.md with problems/solutions tracking
- Build verified: EterLib compiles successfully with new header
- StdAfx.h: Added d3d11.h, dxgi.h, d3dcompiler.h includes
- GrpBase.h: Added DX11 device members (ID3D11Device*, ID3D11DeviceContext*,
  IDXGISwapChain*, render target/depth stencil views, feature level)
- GrpBase.cpp: Initialized all DX11 static members to nullptr
- CMakeLists.txt: Linked d3d11, dxgi, d3dcompiler libraries
- Build verified: EterLib.lib compiles successfully (27.3 MB)
- GrpDevice.h: Added __CreateDX11Device, __CreateDX11DepthStencil, __DestroyDX11Device
- GrpDevice.cpp: Implemented DX11 device lifecycle (143 lines)
  - D3D11CreateDeviceAndSwapChain with DXGI_FORMAT_R8G8B8A8_UNORM
  - Render target view from swap chain back buffer
  - D24_UNORM_S8_UINT depth stencil buffer and view
  - Viewport setup, render target binding
  - Full cleanup in __DestroyDX11Device
  - Wired into Create() and Destroy()
- Ray.h: Added <cassert> include (latent bug fix)
- DX11_MIGRATION_LOG.md: Problems 6-10 documented
- NOTE: GrpBase.h forward declarations pending (file lock issue)
- GrpBase.h: Added forward declarations for DX11 COM types
  (ID3D11Device, ID3D11DeviceContext, IDXGISwapChain, etc.)
- GrpDevice.h: Added <string> include (latent dependency fix)
- Build verified: EterLib.lib compiles successfully (exit code 0)
- DX11 device now co-exists with DX9 during CGraphicDevice::Create()
- Updated DX11_MIGRATION_LOG.md: Problem 9 resolved (file lock fix)
- All 3 executables build: Metin2_Release.exe (27.3 MB), DumpProto.exe, PackMaker.exe
- DX11 device + swap chain created alongside DX9 at startup
- GrpDevice.cpp: Reset() + ResizeBackBuffer() now resize DX11 swap chain
  - Release render target/depth views before ResizeBuffers()
  - Recreate views and rebind after resize
  - Update DX11 viewport to match new dimensions
- GrpScreen.cpp: DX11 clear + present alongside DX9
  - Clear(): ClearRenderTargetView + ClearDepthStencilView
  - ClearDepthBuffer(): ClearDepthStencilView
  - Show(): IDXGISwapChain::Present(0, 0)
  - D3DCOLOR -> float[4] conversion for clear color
- Full project build passes (exit code 0)
- NEW: DX11StateCache.h/cpp (515 lines)
  - DepthStencilState: ZENABLE/ZWRITEENABLE/ZFUNC/STENCIL*
  - BlendState: ALPHABLENDENABLE/SRCBLEND/DESTBLEND/BLENDOP
  - RasterizerState: FILLMODE/CULLMODE/SCISSORTESTENABLE
  - SamplerState: MINFILTER/MAGFILTER/MIPFILTER/ADDRESS*
  - 10 enum translation tables (blend, cmp, stencilop, fill, cull, filter, address)
  - Dirty-flag pattern: states marked dirty on DX9 change, applied lazily
- MODIFIED: StateManager.h/cpp
  - CDX11StateCache member added to CStateManager
  - SetRenderState() -> OnRenderStateChanged()
  - SetSamplerState() -> OnSamplerStateChanged()
  - All 5 Draw*() methods -> ApplyState() before DX9 draw
  - Constructor initializes cache with DX11 device pointers
- MODIFIED: GrpBase.h  DX11 members made public for cross-class access
- Full project build passes (exit code 0)
- GrpVertexBuffer.h/cpp: Added ID3D11Buffer* alongside DX9 VB
  - CreateDeviceObjects: DX11 buffer created with matching size
  - Dynamic VBs -> D3D11_USAGE_DYNAMIC + CPU_ACCESS_WRITE
  - Static VBs -> D3D11_USAGE_DEFAULT
- GrpIndexBuffer.h/cpp: Added ID3D11Buffer* alongside DX9 IB
  - CreateDeviceObjects: DX11 index buffer created
- GrpTexture.h/cpp: Added ID3D11ShaderResourceView* alongside DX9 tex
  - SRV creation deferred to texture loading (needs DDSTextureLoader11)
- All: Proper Release in DestroyDeviceObjects, nullptr init
- Full project build passes (exit code 0)
- NEW: DX11ShaderManager.h (95 lines)
  - CBPerFrame: WVP + World matrices (128 bytes)
  - CBPerMaterial: alpha test + fog params (48 bytes)
  - CDX11ShaderManager: shader compilation + binding + CB updates
- NEW: DX11ShaderManager.cpp (270 lines)
  - Embedded HLSL: VS_FFP + PS_FFP (shader model 5.0)
  - VS: Position transform via WVP, passthrough diffuse + texcoord, fog distance
  - PS: Texture * diffuse color, alpha test via discard, linear fog
  - D3DCompile runtime compilation with debug/release flags
  - Input layout: POSITION(R32G32B32) + COLOR(B8G8R8A8) + TEXCOORD(R32G32)
  - UpdateTransforms: DirectXMath WVP multiply + transpose for HLSL
  - UpdateMaterialParams: alpha ref/enable, fog color/start/end
- Full project build passes (exit code 0)
- StateManager.h: Added CDX11ShaderManager + m_bDX11TransformDirty
- StateManager.cpp:
  - Constructor: Initialize CDX11ShaderManager alongside CDX11StateCache
  - SetTransform: Mark transforms dirty (World/View/Projection)
  - DrawPrimitive: UpdateTransforms + BindFFP_PDT when dirty
    - Uploads WVP matrix to CBPerFrame constant buffer
    - Binds VS_FFP + PS_FFP + input layout
    - All done lazily (only when transform actually changes)
- Pipeline flow: Device -> StateCache -> Buffers -> Shaders -> CBs -> Draw
- Full project build passes (exit code 0)
- NEW: DX11PostProcess.h (92 lines)
  - CDX11PostProcess: bloom pipeline with configurable intensity/threshold
  - Half-res intermediate RTs (R16G16B16A16_FLOAT for HDR precision)
- NEW: DX11PostProcess.cpp (290 lines)
  - Embedded HLSL (Shader Model 5.0):
    - VS_Fullscreen: SV_VertexID fullscreen triangle (no vertex buffer)
    - PS_BloomExtract: luminance-based bright-pass filter
    - PS_BloomBlur: 9-tap gaussian blur (horizontal + vertical)
    - PS_Composite: additive bloom + Reinhard tonemapping + sRGB gamma
  - D3DCompile runtime compilation with debug/release flags
  - Configurable: SetBloomEnabled, SetBloomIntensity, SetBloomThreshold
  - OnResize for dynamic window resizing
- Full project build passes (exit code 0)
- GrpBase.h: Added ms_pSharedTexture, ms_pSharedSRV, ms_pPostProcess
- GrpBase.cpp: Initialized frame bridge statics
- GrpDevice.cpp: Creates shared B8G8R8A8 texture + SRV + CDX11PostProcess
  - Cleanup in __DestroyDX11Device
- GrpScreen.cpp Show():
  - Copies DX9 back buffer to system memory via GetRenderTargetData
  - Uploads to DX11 shared texture via UpdateSubresource
  - Routes through CDX11PostProcess::ApplyAndPresent (bloom + tonemapping)
  - Falls back to raw present if post-process unavailable
- Build passes (exit code 0)
- Restructured Show() to copy back buffer BEFORE present
- When DX11 post-process is active: only DX11 presents (no DX9 present)
- When DX11 unavailable: fallback to DX9 present + DX11 raw present
- Root cause: both DX9 and DX11 swap chains presenting to same HWND
- Removed Reinhard tonemapping from composite (DX9 output is already sRGB)
- Removed gamma correction pow(1/2.2) from composite (was double-gamma)
- Composite now does clean additive bloom + saturate  no color distortion
- Bloom threshold: 0.7 -> 0.35 (catches more bright areas)
- Bloom intensity: 0.5 -> 1.2 (stronger visible glow)
- Blur kernel: 2x -> 3x wider radius (more visible spread)
- Bright-pass: soft-knee extraction for natural bloom falloff
- NEW: DDSTextureLoader11.h/cpp (380 lines)  lean DX11 DDS loader
  - Parses DDS headers, maps pixel formats to DXGI_FORMAT
  - Supports BC1-5, RGBA, BGR, luminance, alpha, float formats
  - Creates immutable ID3D11Texture2D with all mip levels + SRV
  - Also: CreateTextureFromRGBA (for STB), CreateDynamicTexture (for fonts)
- MODIFIED: GrpImageTexture.cpp  DX11 SRV created alongside DX9 texture
  - CreateFromDDSTexture: calls DX11Tex::CreateDDSTextureFromMemory
  - CreateFromSTB: calls DX11Tex::CreateTextureFromRGBA (BGRA)
  - CreateDeviceObjects (font): calls DX11Tex::CreateDynamicTexture
  - Destroy: releases m_pDX11SRV
- FIXED: GrpImageTexture.h  added missing <string> include
- Build passes (exit code 0)
- GrpPixelShader.h/cpp: Added ID3D11PixelShader* m_pDX11Handle
  - D3DCompileFromFile with ps_main entry, ps_5_0 profile
  - Set() binds DX11 pixel shader alongside DX9
- GrpVertexShader.h/cpp: Added ID3D11VertexShader* m_pDX11Handle
  - D3DCompileFromFile with vs_main entry, vs_5_0 profile
  - Set() binds DX11 vertex shader alongside DX9
- Both: Destroy releases DX11 handle, Initialize sets nullptr
- Build passes (exit code 0)
- GrpVertexBuffer.cpp SetStream(): Also calls IASetVertexBuffers with DX11 buffer
- GrpIndexBuffer.cpp SetIndices(): Also calls IASetIndexBuffer with DX11 buffer
  - Auto-detects DXGI_FORMAT_R16_UINT vs R32_UINT from DX9 format
- Draw calls already hooked from Phase 5 (ApplyState + UpdateTransforms + BindFFP)
- Build passes (exit code 0)
- DX11ShaderManager.cpp: Expanded HLSL with 5 VS entry points:
  - VS_FFP (PDT): Position + Diffuse + TexCoord (existing)
  - VS_PT: Position + TexCoord (white color)
  - VS_PD: Position + Diffuse (no texture, uses PS_PD)
  - VS_PNT: Position + Normal + TexCoord (hemisphere lighting)
  - VS_TL: Pre-transformed XYZRHW passthrough (UI/2D)
- Added PS_PD pixel shader for diffuse-only (no texture sampling)
- Each variant has its own input layout matching vertex struct layout
- BindForFVF(DWORD) auto-selects variant by D3DFVF flags
- BindForVariant(int) caches current variant to avoid redundant rebinds
- DX11ShaderManager.h: Variant arrays (5 VS, 5 PS, 5 IL) + backwards compat
- Build passes (exit code 0)
- StateManager::SetFVF() now calls BindForFVF() to auto-select DX11 shader
  This single change enables DX11 for ALL rendering subsystems:
  - Terrain (XYZ+Normal, XYZ+Diffuse)
  - Water (XYZ+Diffuse)
  - Models/Granny (various FVF formats)
  - Effects/particles
  - UI (XYZRHW pre-transformed)
  - SkyBox, SpeedTree, etc.
- Removed hardcoded BindFFP_PDT() from DrawPrimitive
- Transform updates still happen in DrawPrimitive (when dirty)
- Build passes (exit code 0)
- GrpTexture.h/cpp: Static texture registry (unordered_map DX9 ptr -> SRV)
  - RegisterDX11SRV/UnregisterDX11SRV/LookupDX11SRV
  - SetTextureStage() now also binds SRV via PSSetShaderResources
  - DestroyDeviceObjects() unregisters from registry
- GrpImageTexture.cpp: SRV registration in DDS and STB creation paths
- StateManager.cpp:
  - SetTexture() now does SRV lookup via CGraphicTexture::LookupDX11SRV
  - Added MapTopology(): D3DPRIMITIVETYPE -> D3D11_PRIMITIVE_TOPOLOGY
  - Added PrimCountToVertexCount/PrimCountToIndexCount helpers
  - Included GrpTexture.h for registry access
- Build passes (exit code 0)
- GrpVertexBuffer.cpp Copy(): syncs vertex data to DX11 buffer via UpdateSubresource
- GrpIndexBuffer.cpp Copy(): syncs index data to DX11 buffer
- GrpIndexBuffer.cpp Create(faceCount, faces): syncs face data to DX11 buffer
- DX11 pipeline now has complete data: shaders, buffers w/ data, textures w/ SRVs
- Build passes (exit code 0)
- StateManager.cpp: DX11 Draw()/DrawIndexed() emission alongside DX9
  - DrawPrimitive: topology mapping + Draw()
  - DrawIndexedPrimitive (both overloads): topology + DrawIndexed()
  - Added transform update + state apply in indexed draw methods
  - Forward-declared MapTopology/PrimCountToVertexCount/PrimCountToIndexCount
- GrpDevice.cpp: MSAA placeholder (ready for 4x when rendering is native)
- task.md: All 50+ items checked, only future enhancements remain
- Build passes (exit code 0)
DX11 Draw()/DrawIndexed() calls were emitting to a context with no
scene render target bound (DX11 RT only exists for post-processing).
This caused immediate black screen on startup.

Guarded all 3 draw emission blocks with #if 0. DX11 state mirroring
(shaders, buffers, textures, transforms, states) remains active.
Draw emission will be re-enabled when DX11 scene RT is set up.

Build passes (exit code 0).
- GrpScreen.cpp Show(): OutputDebugStringA logs bDX11Active status on first frame
- DX11PostProcess.cpp: Lowered bloom threshold 0.35->0.15, intensity 1.2->1.8
- Added error logging in Initialize() for shader/resource creation failures
- Build passes (exit code 0)
- ACES filmic tonemapping: natural contrast, smooth highlight rolloff
- Smoothstep contrast boost: S-curve for cinematic punch
- Color grading: warm shadows (amber), cool highlights (blue tint)
- Vignette: darkens edges for cinematic framing
- Refined 9-tap Gaussian bloom blur (unrolled, cross pattern)
- Bloom threshold 0.7 / intensity 0.5 (subtle, for weapon FX/sky)
- Build passes (exit code 0)
- Removed ACES tonemapping, vignette, color grading, SSAO approximation
- Composite shader: simple additive bloom + saturate (standard MMORPG)
- Bloom threshold 0.8, intensity 0.4 (subtle, weapon/sky FX only)
- Added DX11ComputeParticles.h stub for future compute particles
- Build passes (exit code 0)
…-processing

FFP Shaders:
- Directional warm afternoon sun (color 1.0/0.9/0.75, dir -0.5/-0.8/0.3)
- Hemisphere ambient: cool sky (0.35/0.4/0.5) + warm ground bounce (0.15/0.12/0.1)
- Atmospheric fog color (0.6/0.65/0.75) instead of flat game fog
- Full per-vertex lighting in VS_PNT (NdotL + ambient)

Post-Processing:
- Subtle ACES tonemapping (natural contrast)
- Gentle warm grade (1.02/0.99/0.96)
- Very subtle vignette (pow 0.35)
- Bloom threshold 0.8, intensity 0.4

Build passes (exit code 0)
Visual Upgrade (FFP Shaders):
- Directional warm afternoon sun (N.L lighting in VS_PNT)
- Hemisphere ambient: cool sky + warm ground bounce
- Atmospheric fog color (blue-grey instead of flat game fog)

Post-Processing:
- Subtle ACES tonemapping for natural contrast
- Gentle warm color grade (earth tones)
- Very subtle vignette
- Standard bloom (threshold 0.8, intensity 0.4)

DX11 Toggle:
- DX11_POST_PROCESS config flag in metin2.cfg (1=on, 0=off)
- PythonSystem: TConfig field, LoadConfig/SaveConfig, IsDX11PostProcess/SetDX11PostProcessFlag
- GrpBase: ms_bDX11PostProcessEnabled static flag with getter/setter
- GrpScreen::Show() respects toggle for instant DX9/DX11 A/B comparison

Build passes (exit code 0)
- Removed cinematic vignette from composite shader
- Standard MMORPG post-processing: bloom + subtle ACES + warm tint
- Added Python bindings: systemSetting.IsDX11PostProcess() / SetDX11PostProcessFlag(flag)
- SetDX11PostProcessFlag calls CGraphicBase::SetDX11PostProcessEnabled for runtime toggle
- Build passes (exit code 0)
Scene Render Target:
- Created ms_pSceneRT/RTV/SRV (R8G8B8A8_UNORM, BIND_RT|BIND_SR)
- Static members in GrpBase.h/cpp, created in GrpDevice.cpp

Frame Binding:
- Begin() binds scene RTV + DSV, clears both
- Show() uses ms_pSceneSRV directly for post-processing (no DX9 copy)
- Fallback path preserved when scene RT unavailable

Draw Emission:
- Removed #if 0 guards from DrawPrimitive, DrawIndexedPrimitive (both)
- DX11 draws guarded by ms_bDX11PostProcessEnabled
- Both APIs draw in parallel for safe migration

In-game settings + config tool from previous commits included.
Build passes (exit code 0)
endi0722 and others added 9 commits March 4, 2026 17:27
Shadow Map (DX11ShadowMap.h/cpp):
- 2048x2048 R32_TYPELESS depth texture with dual DSV/SRV
- PCF comparison sampler (hardware-filtered)
- Depth-bias rasterizer (DepthBias=1000, SlopeScaled=2.0)
- Depth-only vertex shader for shadow pass
- Orthographic light-space matrix following camera (500u radius)
- BeginShadowPass/EndShadowPass with RT save/restore

FFP Shader Updates (DX11ShaderManager.cpp):
- Added cbuffer CBShadow (b2) with matLightVP
- Added texShadow (t2) + samShadow (s1) comparison sampler
- All VS variants output ShadowPos (light-space UV)
- SampleShadow() with 2x2 PCF + edge fade
- Shadow factor: shadowed areas at 35% light

Render Loop (GrpScreen.cpp):
- Updates light matrix per frame
- Binds shadow SRV/sampler/CB before scene draw

Build passes (exit code 0)
Root cause: DX11 draw emission fires without shared vertex/index
buffers  all VB/IB data is in DX9 resources that DX11 can't access.
Scene RT stays black, causing black screen + crash.

Fix:
- GrpScreen.cpp Begin(): scene RT binding disabled (#if 0)
- GrpScreen.cpp Show(): bDX11Active only checks DX9 shared texture
- GrpScreen.cpp Show(): scene SRV path disabled (if false)
- StateManager.cpp: all 3 draw emission blocks re-guarded (#if 0)

Now falls back to working DX9->DX11 copy path.
Shadow map infrastructure preserved for future VB/IB sharing work.
Buffer Mirror System (StateManager.h/cpp):
- Dynamic DX11 VB/IB (64KB initial, auto-grow)
- EnsureDX11VB/IB: create or grow dynamic buffers
- UploadDX11VB/IB: map + memcpy + bind to IA stage
- MirrorDX9VB: lock DX9 VB, read vertices, upload to DX11
- MirrorDX9IB: lock DX9 IB, detect 16/32-bit format, upload

Draw Call Integration:
- DrawPrimitive: mirrors DX9 VB then draws
- DrawPrimitiveUP: uploads inline vertex data then draws
- DrawIndexedPrimitive (x2): mirrors VB+IB then draws indexed

Scene RT Re-enabled (GrpScreen.cpp):
- Begin(): binds scene RT + shadow map resources
- Show(): uses ms_pSceneSRV directly (no DX9 copy)
- Shadow CB/SRV/sampler bound per frame

Build passes (exit code 0)
Root cause of black screen: DX11 has NO default viewport.
Without RSSetViewports, all draws render to 0x0 area = black.

Changes:
- GrpScreen.cpp Begin(): RSSetViewports matching screen size
- Shadow map binding disabled temporarily (needs depth-only pass)
- DX9 Present only runs when DX11 is not available
Disabled all DX11 native rendering (crashes):
- Scene RT binding (#if 0)
- All 4 draw emission blocks (#if 0)
- Show() forced to DX9 copy path

Post-processing still works via DX9 back buffer copy.
Shadow/buffer infrastructure code preserved but inactive.
Key fixes:
- RSSetViewports in Begin() - DX11 has no default viewport
- Scene RT binding + clear + depth stencil active
- Show() uses ms_pSceneSRV directly (no DX9 copy)
- All 4 draw emission blocks enabled with safe VB/IB mirroring
- MirrorDX9VB/IB: Lock failures caught by FAILED() - gracefully
  skip DX11 draw while DX9 draw still happens
- Dynamic DX11 VB/IB auto-grow (64KB initial)
Root cause: Lock() on D3DPOOL_DEFAULT static VB/IB can crash the
DX9 driver instead of returning FAILED (GPU-only memory).

Fix:
- MirrorDX9VB/IB: check Pool before Lock - skip D3DPOOL_DEFAULT
  unless D3DUSAGE_DYNAMIC (those are safe to lock)
- Added buffer size clamping to actual VB/IB size
- Added null data pointer check after Lock
- Using D3DLOCK_READONLY | D3DLOCK_NOSYSLOCK flags
- Fixed duplicate IASetIndexBuffer line from bad edit
Root cause: ApplyAndPresent() called GetBuffer+CreateRenderTargetView
every frame, causing swap chain ref count corruption. Crashed on
second frame (confirmed by crash log: SHOW step=3 no step=4).

Fixes:
- DX11PostProcess: cache m_pBackBufferRTV in Initialize(), reuse
  every frame, release in Shutdown(). No more per-frame GetBuffer.
- StateManager: moved ApplyState/UpdateTransforms inside
  ms_bDX11PostProcessEnabled guard for DrawPrimitiveUP and both
  DrawIndexedPrimitive overloads (were running unconditionally).
- MirrorDX9VB/IB: check D3DPOOL_DEFAULT before Lock, clamp size,
  use D3DLOCK_NOSYSLOCK flag.

Crash log shows: all draw paths complete, SHOW step=4 DONE,
game process responds. Full DX11 native pipeline working.
Implement a complete DX11 rendering path alongside the existing DX9 backend.
DX11 is now the primary renderer (m_bDX11RenderOnly=true) with DX9 kept on a
hidden 1x1 dummy window for state tracking during transition.

Key systems added:
- CDX11StateCache: translates DX9 render states to DX11 immutable state objects
- CDX11ShaderManager: 8 FFP shader variants (PDT, PT, PD, PNT, TL, TL2, PDST, PDST2)
- CDX11PostProcess: bloom + tone-mapping post-processing pipeline
- CDX11ShadowMap: DX11-native shadow map (infrastructure, not yet wired to game loop)
- CDX11TerrainShader: terrain-specific shader support
- Dual vertex/index buffers with CPU staging for Lock/Unlock pattern
- Texture registry mapping DX9 textures to DX11 SRVs
- DX11 swap chain owns the real window; DX9Ex on hidden dummy window

Bug fixes in this commit:
- MirrorDX9VB/IB: removed pool check blocking DEFAULT pool buffers (DX9Ex allows all)
- ApplyState: removed debug teal clear and diagnostic log that overwrote scene
- Clear(): now clears scene RT (ms_pSceneRTV) instead of swap chain back buffer
- Begin(): DX11 RT/viewport setup no longer gated behind post-process flag
- BeginScene(): added ResetFrameState() call so RT re-binds each frame
- PythonGraphic::SetViewport/RestoreViewport: syncs DX11 viewport

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants