假设我们有一个帧缓冲区,其深度附件与名为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
与世界坐标距离进行比较。
答案 0 :(得分:2)
您从深度缓冲区采样的深度位于屏幕空间(又名窗口空间)中,并且对于 world- <是非线性的/ em>或 view-space (又名 eye-space )。它具有一些关于光栅化的良好属性,但不能用于测量世界空间中的距离。
当您修改问题中显示的深度时,您会计算视图空间深度,该深度是线性的,并且与世界空间在同一单元中进行测量(但转换为将相机设置为[0,0,0]。所以,是的,转换是必要的,之后您可以在世界空间单位中比较您的深度。
请注意,深度意味着与相机平面的距离&#34;而不是与相机的距离&#34;。