从这个网站:http ://www.catalinzima.com/?page_id=14
我一直对如何计算深度图感到困惑。
顶点着色器函数计算位置如下:
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
output.TexCoord = input.TexCoord; //pass the texture coordinates further
output.Normal =mul(input.Normal,World); //get normal into world space
output.Depth.x = output.Position.z;
output.Depth.y = output.Position.w;
return output;
}
什么是 output.Position.z 和 output.Position.w?我不确定这背后的数学原理。
在像素着色器中有这一行: output.Depth = input.Depth.x / input.Depth.y;
所以 output.Depth 是 output.Position.z / outputPOsition.w?我们为什么要做这个?
最后在点光着色器(http://www.catalinzima.com/?page_id=55)中将此输出转换为位置,代码为:
//read depth
float depthVal = tex2D(depthSampler,texCoord).r;
//compute screen-space position
float4 position;
position.xy = input.ScreenPosition.xy;
position.z = depthVal;
position.w = 1.0f;
//transform to world space
position = mul(position, InvertViewProjection);
position /= position.w;
再次我不明白这一点。我有点明白为什么我们在之前乘以视图投影时使用 InvertViewProjection,但是整个 z 和现在 w 等于 1,之后整个位置除以 w 让我很困惑。