C++ openGL何时以及如何计算F_深度(深度值)

C++ openGL何时以及如何计算F_深度(深度值),c++,opengl,perspectivecamera,depth-testing,C++,Opengl,Perspectivecamera,Depth Testing,也就是说,在这一点上,投影已经完成了。本文给出了OpenGL使用的投影矩阵,影响点的z坐标的因素是行: [0-(f+n)/(f-n)-2fn/(f-n)] 注意,计算此矩阵是为了使“金字塔”平截头体成为单位立方体。这意味着应用此矩阵后,z坐标也已映射到[0,1] 然后,作者在深度值精度一章中告诉我们: 视图空间中的这些z值可以是平截头体近平面和远平面之间的任何值,我们需要某种方法将它们转换为[0,1]。 问题是为什么在这一点上,当我们在应用投影矩阵时已经映射了它 他还说: 像这样的线性深度缓冲

也就是说,在这一点上,投影已经完成了。本文给出了OpenGL使用的投影矩阵,影响点的z坐标的因素是行:

[0-(f+n)/(f-n)-2fn/(f-n)]
注意,计算此矩阵是为了使“金字塔”平截头体成为单位立方体。这意味着应用此矩阵后,z坐标也已映射到[0,1]

然后,作者在深度值精度一章中告诉我们: 视图空间中的这些z值可以是平截头体近平面和远平面之间的任何值,我们需要某种方法将它们转换为[0,1]。 问题是为什么在这一点上,当我们在应用投影矩阵时已经映射了它

他还说: 像这样的线性深度缓冲区:
F_depth=z-near/(far-near)
从未使用过,为了获得正确的投影特性,使用了非线性深度方程:

F_深度=(1/z-1/近)/(1/far-1/近)
但是,正如我们所看到的,z在范围内映射使用:

[0-(f+n)/(f-n)-2fn/(f-n)]
这似乎是线性的

所有这些自相矛盾的说法让我真的很困惑,什么时候计算和比较碎片的深度,以及实际用来计算碎片深度的方程式是什么。在我的理解中,在应用OpenGL投影矩阵之后,不应该再计算深度了,但是在阅读了这篇文章之后,我真的很困惑。有任何澄清吗?

由于透视分界线,深度处的澄清不是线性的

当投影矩阵变换顶点坐标时,将计算剪辑空间坐标。剪辑空间坐标为。现在,将剪裁不在剪辑空间(中)中的所有几何体。剪裁规则是:


<代码> -W,但是<代码> fx深度公式必须有某种错误,考虑近,远>1;因为,| 1/near |<1总是,但| 1/z |>=1总是,和|(1/far-1/near)|<1总是,这意味着F|u深度>1总是?@horxCoder不,这不是完整的公式。投影矩阵计算剪辑空间坐标(4个分量)。剪辑空间的组件被w组件分割。投影矩阵从视图空间变换到剪辑空间。在普通视图中,空间是右手系统,而剪辑空间(NDC)是左手系统。投影矩阵镜像z轴。@horxCoder
[0 0-(f+n)/(f-n)-2fn/(f-n)]
不定义映射。这是4x4透视投影矩阵的第三行。您所说的“不定义映射”是什么意思?它将某事物的z坐标映射到[-1,1],不是吗?@horxCoder否剪辑空间坐标不在[-1,1]中。我从来没有说过这样的话。剪辑空间坐标和NDC都不限于某个范围。但在标准化设备空间中,查看体积内的几何体在范围[-1,1](笛卡尔坐标系的所有3个组件)内。