从这个网站: 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top