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

如何在DirectX 9像素着色器中正确读取深度纹理?

DirectX 9深度纹理采样问题解决方法

问题根源

你遇到的白色矩形问题,本质是DirectX 9中ps.1.4的texld指令对纹理坐标分量的特殊处理:

  • 纹理坐标t0的z分量用于控制mipmap的LOD(细节层次),0对应最粗糙的mip层级(无mipmap时会被视为全白默认纹理),数值越大采样的纹理层级越模糊。
  • 你之前把t0.z设为0,采样器直接取了最粗糙的无效层级,所以输出白色;设为0.5时,采样器取了中间层级,才接近正确的深度图。

正确实现方案

顶点着色器修正

如果你的深度纹理未启用mipmap,直接将t0.z设为极小值(而非0),避免采样器误判到最粗糙层级:

struct VS_INPUT
{
    float4 pos : POSITION;
    float2 t0 : TEXCOORD0;
};

struct VS_OUTPUT
{
    float4 pos : POSITION;
    float4 t0 : TEXCOORD0;
};

VS_OUTPUT main(const VS_INPUT v)
{
    VS_OUTPUT o;

    o.pos = v.pos;
    // z分量设为极小值,确保采样最清晰的纹理层级;w分量保持1.0不影响采样
    o.t0 = float4(v.t0.x, v.t0.y, 0.0001f, 1.0f);

    return o;
}

补充说明

ps.1.4的texld指令中,四分量纹理坐标t0的各部分作用:

  • x/y:2D纹理的UV采样坐标
  • z:mipmap LOD控制值(0=最清晰层级,数值越大层级越粗糙)
  • w:纹理坐标权重(通常设为1.0,无特殊需求无需修改)

如果你的深度纹理明确不需要mipmap,也可以在创建纹理时关闭mipmap生成,此时将t0.z设为0也能正常工作,但部分老显卡驱动可能存在兼容问题,用极小值的方案兼容性更好。

内容的提问来源于stack exchange,提问作者John Tracid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:48:17