我在读很棒的 OpenGL 教程 https://paroj.github.io/gltut/Positioning/Tut05%20Overlap%20and%20Depth%20Buffering.html。这真的很棒,相信我。我当前的主题是Z-buffer。除了解释这一切之外,作者还提到我们可以执行自定义深度测试,例如 GL_LESS、GL_ALWAYS 等。他还解释了深度值(哪些是顶部,哪些不是)的实际含义也可以是定制。到目前为止我明白了。然后作者说了一些令人难以置信的话:
范围zNear可以大于范围zFar;如果是,那么
就构成而言,窗口空间值将被反转
距离观看者最近或最远。
早些时候,有人说窗口空间 Z 值 0 最接近,
1 是最远的。然而,如果我们的剪辑空间 Z 值被否定,
深度为 1 将最接近视图,深度为 0 将是
最远。然而,如果我们翻转深度测试的方向(GL_LESS 到
GL_GREATER 等),我们得到完全相同的结果。所以这实际上只是一个
习俗。事实上,翻转 Z 符号和深度测试曾经是
对于许多游戏来说至关重要的性能优化。
如果我理解正确的话,从性能角度来看,翻转 Z 的符号和深度测试只不过是改变一个<
与一个比较>
比较。所以,如果我理解正确并且作者没有撒谎或捏造事实,那么就改变<
to >
以前是至关重要的优化对于很多游戏来说。
到底是作者胡编乱造,还是我理解有误,还是事实确实如此?<
速度较慢(vitally,正如作者所说)比>
?
感谢您澄清这个非常奇怪的问题!
Disclaimer: I am fully aware that algorithm complexity is the primary source for optimizations. Furthermore, I suspect that nowadays it definitely wouldn't make any difference and I am not asking this to optimize anything. I am just extremely, painfully, maybe prohibitively curious.
如果我理解正确的话,从性能角度来看,翻转 Z 的符号和深度测试只不过是将 比较。所以,如果我理解正确并且作者没有撒谎或捏造的话,那么将 曾经是许多游戏的重要优化。
我没有解释得特别清楚,因为这并不重要。我只是觉得这是一个有趣的琐事补充。我并不打算专门讨论该算法。
然而,背景是关键。我从未说过 比较快。请记住:我们谈论的是图形硬件深度测试,而不是 CPU。不是operator<
.
我指的是一种特定的旧优化,您将使用一个框架GL_LESS
范围为 [0, 0.5]。下一帧,您渲染GL_GREATER
范围为 [1.0, 0.5]。你来回走动,每帧都“翻转 Z 符号和深度测试”。
这会损失一点深度精度,但您不必清除深度缓冲区,这曾经是一个相当慢的操作。由于如今深度清理不仅是免费的,而且实际上比这种技术更快,所以人们不再这样做了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)