0

从这个网站: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 让我很困惑。

4

1 回答 1

3

要完全理解这一点,您需要了解支持 3D 变换的代数是如何工作的。SO并没有真正帮助(或者我不知道如何使用它)来做矩阵数学,所以它必须没有花哨的公式。不过,这里有一些高级别的解释:

如果您仔细观察,您会注意到发生在顶点位置(从模型到世界到视图到剪辑坐标)的所有变换都恰好使用 4D 向量。这是正确的。4D。为什么,当我们生活在 3D 世界中时?因为在那个 4D 表示中,我们通常想要对顶点进行的所有变换都可以表示为矩阵乘法。如果我们停留在 3D 表示中,情况并非如此。矩阵乘法是 GPU 擅长的。

3D 中的顶点对应于 4D 中的什么?这就是有趣的地方。该(x, y, z)点对应于线(a.x, a.y, a.z, a)。我们可以抓住这条线上的任何一点来做我们需要的数学运算,我们通常选择最简单的一个,a=1(这样,我们不必做任何乘法,只需 set w=1)。

因此,这几乎可以回答您正在查看的所有数学问题。为了在 4D 中投影 3D 点,我们设置 w=1,为了从 4D 向量中取回一个分量,我们想要与我们在 3D 中的标准尺寸进行比较,我们必须将该分量除以 w。

这个坐标系,如果你想深入研究,叫做homogeneous coordinates

于 2009-11-11T17:49:44.870 回答