深度纹理中纹素的单位是多少?

时间:2014-05-21 21:40:41

标签: opengl directx rendering shader

假设我们有一个帧缓冲区,其深度附件与名为depthTexture的纹理相关。如果我们将此纹理绑定到管道并在下一个渲染过程中读取值depth = texture2D(depthTexture, texCoord),那么depth的单位是什么?

让我们更具体一点:假设我们在near处建立了一个近平面的摄像机,在far处设置了一个近平面(在视图空间坐标系中)。据我所知,存储在depthTexture中的前一遍的深度值乘以投影矩阵。因此,我们需要以下列方式修改depth

depth = 2 * near * far / (far + near - (far - near) *
    (2 * texture2D(gDepthTexture, tex).x - 1));

然而:我想知道,这种转变是否有必要以及depth(之前和之后)的单位是什么。

我希望能够将depth与世界坐标距离进行比较。

1 个答案:

答案 0 :(得分:2)

您从深度缓冲区采样的深度位于屏幕空间(又名窗口空间)中,并且对于 world- <是非线性的/ em>或 view-space (又名 eye-space )。它具有一些关于光栅化的良好属性,但不能用于测量世界空间中的距离。

当您修改问题中显示的深度时,您会计算视图空间深度,该深度是线性的,并且与世界空间在同一单元中进行测量(但转换为将相机设置为[0,0,0]。所以,是的,转换是必要的,之后您可以在世界空间单位中比较您的深度。

请注意,深度意味着与相机平面的距离&#34;而不是与相机的距离&#34;。

Difference between distance and depth.