Directx HLSL中的渲染深度

Directx HLSL中的渲染深度,directx,shader,hlsl,Directx,Shader,Hlsl,大家好 这应该是一个简单的任务,但由于某些原因,我没有得到它的工作 我只想使用着色器对场景中的深度进行可视化: float4x4 matViewProjection; float4x4 matWorld; float4 eyePos; struct VS_OUTPUT { float4 position : POSITION0; float depth : TEXCOORD0; }; VS_OUTPUT vs_main( VS_INPUT input ) { VS_OUTPUT

大家好 这应该是一个简单的任务,但由于某些原因,我没有得到它的工作

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

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;
这会根据到对象的距离给出令人满意的结果。因此,如果我靠近对象,我将不得不再次调整该值

所以有些事情很不对劲


谢谢你的阅读

您的问题是,您没有在任何点对深度值进行归一化。它可以是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值都位于平截头体之外(即在近剪裁平面之前或远剪裁平面之后),因此无论如何都不会到达像素着色器。

只是一个简短的添加: 使用

结果沿距离呈现从暗到亮的颜色,而

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

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

是的。。。我没有忘记对值进行规格化,但我使用了normalize()函数,只得到了一个灰色。。。我没有想过使用同质分割-谢谢你的提醒!!!请记住,我所说的归一化与向量归一化非常不同。
output.depth    = 1.0f - (output.position.z / output.position.w);