【发布时间】:2009-11-11 16:35:08
【问题描述】:
来自这个网站: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 让我很困惑。
【问题讨论】:
标签: google-maps map directx shader depth