我只能使用 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 个组件以及它如何与深度纹理配合使用的文档。
看起来没有办法从深度纹理中读取。如果您使用格式
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;
}