gpt4 book ai didi

opengl - (gl_FragCoord.z/gl_FragCoord.w) 代表什么?

转载 作者:行者123 更新时间:2023-12-04 09:15:29 28 4
gpt4 key购买 nike

我想要真实的世界空间距离,我从实验中得到的感觉是
(gl_FragCoord.z / gl_FragCoord.w)
是世界空间的深度?但我不太确定。

编辑 我刚刚found where I had originally located this snippet of code .显然这是相机的实际深度?

最佳答案

这是(由同一个人)询问的和 answered elsewhere .我在这里解释和修饰答案:

OpenGL 4.3 core profile specification (PDF) 的第 15.2.2 节所述, gl_FragCoord.w1 / clip.w ,其中 clip.w是剪辑空间位置的 W 分量(即:您写入的内容 gl_Position )。
gl_FragCoord.z由以下过程生成,假设通常的转换:

  • 通过顶点着色器中的投影矩阵乘法将相机空间转换为剪辑空间。 clip.z = (projectionMatrix * cameraPosition).z
  • 转换为标准化设备坐标。 ndc.z = clip.z / clip.w
  • 转换为窗口坐标,使用 glDepthRange near/far values . 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 already gives you the range near/far)并计算这些 AB值,或者您需要使用投影矩阵的逆。或者,您可以自己直接使用投影矩阵,因为片段着色器可以使用顶点着色器可用的相同制服。您可以选择 AB项直接来自该矩阵。 A = projectionMatrix[2][2] , 和 B = projectionMatrix[3][2] .

    关于opengl - (gl_FragCoord.z/gl_FragCoord.w) 代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711252/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com