在HLSL中渲染深度

Sid*_*ect 2 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 output;
 output.position = mul( input.position, matViewProjection );

 float3 posWorld = mul(input.position, matWorld);
 output.depth = distance(posWorld, eyePos);
 return( output );
}
Run Code Online (Sandbox Code Playgroud)

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

和相应的像素着色器

float4 ps_main(VS_OUTPUT input) : COLOR0
{   
   float depth = input.depth;
   return float4(depth, depth, depth, 1.0f);
}
Run Code Online (Sandbox Code Playgroud)

除了白色之外什么也没有结果

所以我开始尝试将错误值乘以深度:

float depth = input.depth * 0.005f;
Run Code Online (Sandbox Code Playgroud)

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

所以这是非常错误的......

谢谢阅读!

Goz*_*Goz 5

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

请为您的vert着色器尝试以下操作:

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 );
}
Run Code Online (Sandbox Code Playgroud)

划分后,任何有效的Z值都将在0到1的范围内.任何不在此范围内的Z值都在截锥体之外(即在近剪裁平面的前面或在远剪裁平面的后面),因此赢了无论如何都要去像素着色器.