13

我想要实际的世界空间距离,我从实验中得到感觉

(gl_FragCoord.z / gl_FragCoord.w)

世界空间的深度是多少?但我不太确定。

编辑我刚刚找到了我最初找到这段代码的位置。显然这是相机的实际深度?

4

3 回答 3

27

这是(由同一个人)询问并在其他地方回答的。我在这里解释和修饰答案:

如OpenGL 4.3 核心配置文件规范 (PDF)的第 15.2.2 节所述,gl_FragCoord.w1 / clip.wclip.w剪辑空间位置的 W 分量在哪里(即:您写入的内容gl_Position)。

gl_FragCoord.z由以下过程生成,假设通常的变换:

  1. 相机空间到剪辑空间的变换,通过顶点着色器中的投影矩阵乘法。clip.z = (projectionMatrix * cameraPosition).z
  2. 转换为标准化的设备坐标。ndc.z = clip.z / clip.w
  3. glDepthRange使用近/远值转换为窗口坐标。win.z = ((dfar-dnear)/2) * ndc.z + (dfar+dnear)/2.

现在,使用默认深度范围 near=0, far=1,我们可以win.z根据剪辑空间定义:(clip.z/clip.w)/2 + 0.5。如果我们然后将其除以gl_FragCoord.w,则相当于乘以clip.w,从而得到:

(gl_FragCoord.z / gl_FragCoord.w) = clip.z/2 + clip.w/2 = (clip.z + clip.w) / 2

使用标准投影矩阵,clip.z表示从相机空间 Z 分量的比例和偏移量。比例和偏移由相机的近/远深度值定义。clip.w同样在标准投影矩阵中,只是相机空间 Z 的否定。因此,我们可以用这些术语重新定义我们的方程:

(gl_FragCoord.z / gl_FragCoord.w) = (A * cam.z + B -cam.z)/2 = (C * cam.z + D)

其中AB表示基于近/远的偏移和比例,以及C = (A - 1)/2D = B / 2

因此,不是gl_FragCoord.z / gl_FragCoord.w相机空间(或世界空间)到相机的距离。它也不是到相机的相机空间平面距离。但它相机空间深度的线性变换。如果它们来自同一个投影矩阵等等,您可以使用它来比较两个深度值。

要实际计算相机空间 Z,您需要将相机靠近/远离矩阵传递(OpenGL已经为您提供了范围 near/far)并从中计算这些值AB值,或者您需要使用投影矩阵。或者,您可以自己直接使用投影矩阵,因为片段着色器可以使用与顶点着色器相同的制服。您可以直接从该矩阵中选择A和项。, 和.BA = projectionMatrix[2][2]B = projectionMatrix[3][2]

于 2012-12-05T20:10:31.673 回答
3

根据文档

Available only in the fragment language, gl_FragDepth is an output variable that
is used to establish the depth value for the current fragment. If depth buffering
is enabled and no shader writes to gl_FragDepth, then the fixed function value
for depth will be used (this value is contained in the z component of
gl_FragCoord) otherwise, the value written to gl_FragDepth is used.

因此,除非您在着色器中的其他位置设置它,否则它看起来gl_FragDepth应该只是。gl_FragCoord.z

于 2012-12-04T20:38:54.473 回答
0

作为

gl_FragCoord.w = 1.0 / gl_Position.w

并且(可能)您的投影矩阵从 -z 获取 w(如果最后一列是 0,0,-1,0)然后;

float distanceToCamera = 1.0 / gl_FragCoord.w;
于 2013-05-18T14:32:43.973 回答