You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:43:13