3

嗨,伙计们,这应该是一件容易的事,但由于某种原因,我没有解决...

我只想使用着色器来可视化场景中的深度:

float4x4 matViewProjection;
float4x4 matWorld;
float4 eyePos;

struct VS_OUTPUT 
{
  float4 position : POSITION0;
  float depth : TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT input )
{
 VS_OUTPUT output;
 output.position = mul( input.position, matViewProjection );

 float3 posWorld = mul(input.position, matWorld);
 output.depth = distance(posWorld, eyePos);
 return( output );
}

为了获得深度值(或者我认为),我计算了世界空间中的位置与视图位置之间的距离。

以及对应的像素着色器

float4 ps_main(VS_OUTPUT input) : COLOR0
{   
   float depth = input.depth;
   return float4(depth, depth, depth, 1.0f);
}

结果是白色

所以我开始试错将一个值乘以深度:

float depth = input.depth * 0.005f;

根据与物体的距离,它给出了令人满意的结果。因此,如果我靠近对象,我将不得不再次调整该值。

所以有什么非常不对劲的...

谢谢阅读!

4

2 回答 2

5

那么你的问题是你没有在任何时候标准化深度值。它可以是 ZNear 到 ZFar 范围内的任何位置。

为您的垂直着色器尝试以下操作:

VS_OUTPUT vs_main( VS_INPUT input )
{
 VS_OUTPUT output;
 output.position = mul( input.position, matViewProjection );
 output.depth    = output.position.z / output.position.w;
 return( output );
}

在 w 除之后,任何有效的 Z 值都将在 0 到 1 的范围内。任何不在此范围内的 Z 值都在截锥体之外(即在近剪裁平面之前或远剪裁平面之后),因此获胜无论如何都不要进入像素着色器。

于 2010-10-16T13:50:08.473 回答
2

只是一个简短的补充:使用

output.depth    = output.position.z / output.position.w;

导致远处的颜色从暗到亮,而

output.depth    = 1.0f - (output.position.z / output.position.w);

会导致从亮到暗的颜色,希望这也是正确的。

于 2010-10-16T16:23:13.480 回答