DirectX12渲染器实现中Depth Stencil功能异常求助
DirectX12深度模板功能异常:Z值无法正确区分物体前后层级
我在实现DirectX12渲染器时遇到深度模板(Depth Stencil)功能异常的问题,已经排查并修复了所有能想到的潜在问题,但故障依然存在。代码仓库地址是https://github.com/j-jiwon/ZNEngine,希望能得到帮助定位问题。
目前观察到的核心现象:
- Z值更大的物体没有按预期绘制在后方
- 设置0到1之间的Z值时,最终记录的深度值只有0或1两种极端情况
我咨询过相关工具并修复了它指出的潜在问题区域,但仍找不到根本原因。已经修改Shader代码并检查管线配置,期望深度模板能正常工作。
在Render()函数中设置了不同Z位置的测试物体:
void ApplicationContext::Render() { RenderBegin(); defaultShader->Bind(); { Transform t1; t1.offset = ZNVector4(0.25f, 0.25f, 0.3f, 0.f); defaultMesh->SetTransform(t1); defaultMesh->SetTexture(defaultTexture); defaultMesh->Render(); } { Transform t; t.offset = ZNVector4(0.0f, 0.f, 0.2f, 0.f); defaultMesh->SetTransform(t); defaultMesh->SetTexture(defaultTexture); defaultMesh->Render(); } RenderEnd(); }
按预期,Z值为0.3f的t1对应的纹理应该绘制在Z值0.2f的t后方,但实际显示结果完全相反。我没发现Shader代码存在问题,推测问题可能出在管线设置或其他底层环节。作为DirectX12新手,希望能找到问题所在并解决。
相关调试素材:
- 渲染逻辑代码截图
- PIX调试捕获截图
我的Shader代码如下:
cbuffer TEST_B0 : register(b0) { float4 offset0; }; cbuffer TEST_B1 : register(b1) { float4 offset1; }; Texture2D tex_0 : register(t0); SamplerState sam_0 : register(s0); struct VS_IN { float3 pos : POSITION; float4 color : COLOR; float2 uv : TEXCOORD; }; struct VS_OUT { float4 pos : SV_Position; float4 color : COLOR; float2 uv : TEXCOORD; }; VS_OUT VS_Main(VS_IN input) { VS_OUT output = (VS_OUT) 0; output.pos = float4(input.pos, 1.f); output.pos += offset0; output.color = input.color; output.uv = input.uv; return output; } float4 PS_Main(VS_OUT input) : SV_Target { float4 color = tex_0.Sample(sam_0, input.uv); return color; }
内容的提问来源于stack exchange,提问作者Dev ZIWON
相关产品推荐
相关产品推荐

