嗨伙计们 这应该是一项简单的任务,但由于某种原因,我不能解决这个问题......
我只想使用着色器获取场景深度的可视化:
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;
根据到物体的距离给出令人满意的结果。因此,如果我靠近物体,我将不得不再次调整该值。
所以这是非常错误的......
感谢阅读!
答案 0 :(得分: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 );
}
划分后,任何有效的Z值都将在0到1的范围内。任何不在此范围内的Z值都在截锥体之外(即在近剪裁平面的前面或在远剪裁平面的后面)因此无论如何都不会进入像素着色器。
答案 1 :(得分:2)
只是一个简短的补充: 使用
output.depth = output.position.z / output.position.w;
导致沿着距离暗到亮的颜色
output.depth = 1.0f - (output.position.z / output.position.w);
会导致明亮到深色,这也很有希望。