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

问题描述 投票:0回答:1

我只能使用 DirectX 9 和 asm。如果我使用以下顶点着色器:

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;
    o.t0=float4(v.t0.x, v.t0.y, 0, 1);

    return o;
}

和像素着色器:

ps.1.4

texld r0, t0

我得到白色矩形。如果我开始使用 t0 的第三个分量(例如我将其设置为 0.5),我会得到接近正确深度图的东西。

如何以正确的方式做到这一点?我找不到任何关于

t0
的 4 个组件以及它如何与深度纹理配合使用的文档。

shader directx direct3d9
1个回答
0
投票

看起来没有办法从深度纹理中读取。如果您使用格式

texld
和用法
D3DFMT_D16
的纹理中的
D3DUSAGE_DEPTHSTENCIL
指令进行阅读,那么实际上您就进行了阴影测试。

这就是地址向量的第三个分量影响采样结果的原因。 NVIDIA 开发者门户

如果存在与纹理维度相比的额外坐标,则它将用于执行阴影比较。阴影比较中使用的值始终是坐标向量的最后一个分量。

因此,当我们使用具有四个组件的地址时,我们对第三个组件进行阴影测试,我们得到 0 或 1。到目前为止,我发现的唯一方法是多次采样以更接近深度值:

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

texture DepthTexture;
sampler2D DepthSampler = sampler_state
{
    Texture = (DepthTexture);
    MinFilter = Linear;
    MagFilter = Linear;
    MipFilter = Linear;
    AddressU  = Clamp;
    AddressV  = Clamp;
};

int NumberOfSteps = 10;

float4 main(VS_OUTPUT In) : COLOR
{
    float4 r = 0;
    float depth = 0;
    float stepWeight = 1.0 / NumberOfSteps;
    for (int i = 0; i < NumberOfSteps; i++)
    {
        r += tex2Dproj(DepthSampler, float4(In.t0.x, In.t0.y, depth, 1.0)) * stepWeight;
        depth += stepWeight;
    }
    return r;
}
© www.soinside.com 2019 - 2024. All rights reserved.