从前,当>比<... 等等,什么?

我正在读一个很棒的OpenGL教程。真的很棒,相信我。我目前的主题是Z-buffer。除了解释它的全部内容外,作者还提到我们可以执行自定义深度测试,例如GL_LESS, GL_ALWAYS等。他还解释说,深度值的实际含义(哪些是top,哪些不是)也可以自定义。到目前为止我明白了。然后作者说了一些难以置信的话

zNear范围可以大于zFar范围;如果是,那么 窗口空间的值将颠倒,就构成内容而言

前面说过,窗口空间Z值为0是最接近和的 1是最远的。然而,如果我们的剪辑空间Z值为负,则 深度为1的最接近视图,深度为0的最接近视图 最远的。然而,如果我们翻转深度测试的方向(GL_LESS到 GL_GREATER,等等),我们得到完全相同的结果。所以它实际上就是a 公约。的确,翻转Z的符号和深度测试是一次 许多游戏的重要性能优化。

如果我理解正确的话,在性能方面,翻转Z的符号和深度测试只不过是将<比较更改为>比较。所以,如果我理解正确,作者没有说谎或编造事情,那么改变<>曾经是许多游戏的一个重要的优化

是作者在胡编乱造,还是我误解了什么,或者确实是这样,曾经<>慢(正如作者所说的极其) ?

谢谢你澄清这个相当奇怪的问题!

免责声明:我充分意识到算法的复杂性是优化的主要来源。此外,我怀疑现在它肯定不会有任何不同,我并不是要求优化任何东西。我只是极度的,痛苦的,也许是极度的好奇。

14038 次浏览

它与高度调优的汇编中的标志位有关。

x86有jl和jg指令,但大多数RISC处理器只有jl和jz指令(没有jg)。

如果我理解正确的话,在性能方面,翻转Z的符号和深度测试只不过是改变一个<对>的比较。所以,如果我理解正确,作者没有说谎或编造东西,那么改变<>曾经是许多游戏的重要优化。

我没有解释得特别好,因为这并不重要。我只是觉得这是一个有趣的小细节,我不打算详细介绍算法。

然而,背景是关键。我从来没有说过a <比较比>比较快。记住:我们讨论的是图形硬件深度测试,而不是CPU。不是operator<

我指的是一个特定的旧优化,其中一帧你将使用GL_LESS,范围为[0,0.5]。下一帧,你用范围为[1.0,0.5]的GL_GREATER渲染。你来来回回,字面上“翻转Z的符号和深度测试”每帧。

这将损失一点深度精度,但您不必清除深度缓冲区,这曾经是一个相当缓慢的操作。由于深度清理不仅是免费的,而且实际上比这种方法更快,人们不再做这种方法了。

答案几乎可以肯定的是,无论使用哪种芯片+驱动程序,分层Z都只能在一个方向上工作——这在当时是一个相当常见的问题。低级组装/分支与此无关——z缓冲是在固定功能硬件中完成的,并且是流水线化的——没有推测,因此也没有分支预测。