如何在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
相关产品推荐
相关产品推荐

