如何在计算深度图这项工作?
-
19-09-2019 - |
题
从这个网站: 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划分正在取得混淆了我不少。
解决方案
要完全理解这一点,你需要明白,巩固三维代数是如何将作品。 SO并不能真正帮助(或我不知道如何使用它)做矩阵数学,所以它必须是没有花哨formulaes。下面是一些高水平解释虽然:
如果你仔细观察,你会发现,这种情况发生的顶点位置全部转换(从模型到世界观看剪辑坐标)碰巧使用4D向量。那就对了。 4D。为什么,当我们生活在一个3D世界?因为在那个4D表示,所有我们平时要做到顶点变换可表达为一个矩阵乘法。这是的不的,如果我们留在3D表现的情况。和矩阵乘法是什么GPU所擅长的。
什么在3D顶点对应于图4D?这是它变得有趣。该(x, y, z)
点对应于线(a.x, a.y, a.z, a)
。我们可以抓住这一线做我们所需要的数学的任何一点,和我们平时挑最简单的一个,a=1
(这样一来,我们没有做任何乘法,只需设置w=1
)。
这样的答案几乎所有的数学你看。为了项目4D我们设置W = 1的3D点,从4D向量得到一个组成部分,我们要比较对我们在3D标准尺寸,我们必须用W来划分该组件。
这个坐标系中,如果你想更深入了解,被称为homogeneous coordinates
。