曾几何时,当>比<......快,等等,什么?

Arm*_*yan 276 c opengl cpu optimization gpu

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

zNear的范围可以大于zFar的范围; 如果是,则窗口空间值将根据与观看者最近或最远的内容来反转.

早些时候,据说窗口空间Z值为0,最接近1.但是,如果我们的剪辑空间Z值被否定,则1的深度将最接近视图,0的深度将最远.然而,如果我们翻转深度测试的方向(GL_LESS到GL_GREATER等),我们得到完全相同的结果.所以这真的只是一个惯例.事实上,翻转Z的标志和深度测试曾经是许多游戏的重要性能优化.

如果我理解正确,性能方面,翻转Z的符号和深度测试只不过是将<比较改为>比较.所以,如果我理解正确并且作者没有说谎或做事,那么<改为>以前是许多游戏的重要优化.

是作者胡编,我误解的东西,或者是它确实是曾经的情况下<较慢(至关重要,正如作者说)比>

谢谢你澄清这个非常奇怪的事情!

免责声明:我完全清楚算法复杂性是优化的主要来源.此外,我怀疑现在肯定没有任何区别,我不是要求它优化任何东西.我非常痛苦,也许是令人望而却步的好奇心.

Nic*_*las 345

如果我理解正确,性能方面,翻转Z的符号和深度测试只不过是改变<比较到>比较.所以,如果我理解正确并且作者没有说谎或做出任何事情,那么改变<to>曾经是许多游戏的重要优化.

我没有特别好地解释,因为它并不重要.我觉得这是一个有趣的琐事.我不打算专门讨论这个算法.

但是,背景是关键.我从来没有说过<比较比比较快.请记住:我们谈论的是图形硬件深度测试,而不是CPU.没有operator<.

我所指的是一个特定的旧优化,其中一个帧将使用 GL_LESS范围为[0,0.5].下一帧,GL_GREATER使用范围[1.0,0.5]进行渲染.你来回走动,字面意思是"每一帧都在翻转Z的标志和深度测试".

这会失去一点深度精度,但您不必清除深度缓冲区,这曾经是一个相当慢的操作.由于深度清除这些天不仅是免费的,而且实际上比这种技术更快,人们不再这样做了.

  • @NicolBolas:PerTZHX的评论,在我的问题中你的教程的链接已经死了.你能告诉我们所有教程移动的地方吗?你可以选择编辑这个问题吗? (3认同)
  • 如今清除深度缓冲区速度更快的原因有两个,这两个原因都基于 GPU 使用分层深度缓冲区这一事实。因此,只需清除将图块状态设置为清除(这很快),但是,更改深度比较符号意味着需要刷新整个 HiZ 缓冲区,因为它仅存储取决于比较符号的最小值或最大值。 (2认同)
  • 这些教程可在Web存档中找到.如果@NicolBolas允许,如果我们可以将它们移动到更易于访问的位置,它将对社区有所帮助.也许GitHub或其他什么.http://web.archive.org/web/20150215073105/http://arcsynthesis.org/gltut/ (2认同)