曾几何时,当>比<…快时,等等,什么?
我正在阅读一个很棒的OpenGL教程 。 真是太好了,相信我。 我目前的主题是Z缓冲。 除了解释这一切之外,作者还提到我们可以执行自定义的深度testing,比如GL_LESS,GL_ALWAYS等等。他还解释说,深度值的实际意义(也就是顶部而不是)也可以是定制。 我明白迄今为止。 然后作者说了一些不可思议的事情:
范围zNear可以大于范围zFar; 如果是这样的话,则窗口空间值将被颠倒,从观察者的距离最近或最远的angular度来看。
早些时候,有人说,0的窗口空间Z值最接近,1是最远的。 但是,如果我们的剪辑空间Z值被否定,则1的深度将最接近视图,并且0的深度将最远。 然而,如果我们翻转深度testing的方向(GL_LESS到GL_GREATER等),我们得到完全相同的结果。 所以这只是一个惯例。 事实上,翻转Z的标志和深度testing曾经是许多游戏的重要性能优化。
如果我理解正确的话,性能方面,翻转Z的符号和深度testing只不过是改变一个比较。 所以,如果我理解正确并且作者不是在说谎或者做出反应,那么改变<
to >
曾经是许多游戏的重要优化 。
作者是不是在写东西,是我误解了什么,或者确实是这样,一旦<
作者所说的慢(比作者所说的)要严重>
?
感谢澄清这个相当好奇的事情!
免责声明:我完全知道algorithm的复杂性是优化的主要来源。 而且,我怀疑现在肯定不会有什么区别,我也不是要求这个来优化任何东西。 我只是非常,痛苦,也许令人难以置信的好奇。
如果我理解正确的话,性能方面,翻转Z的符号和深度testing只不过是改变一个比较。 所以,如果我理解正确并且作者不是在说谎或者做出反应,那么改变<to>曾经是许多游戏的重要优化。
我没有特别好解释,因为这不重要。 我只是觉得这是一个有趣的小事添加。 我并不打算特意重复这个algorithm。
但是,上下文是关键。 我从来没有说过,比起来比比较快。 请记住:我们正在讨论graphics硬件深度testing,而不是您的CPU。 不是operator<
。
我所指的是一个特定的旧优化,其中一个帧将使用GL_LESS
,范围为[ GL_LESS
]。 下一帧,您使用范围为[ GL_GREATER
]的GL_GREATER
进行渲染。 你来来回回,每一帧都字面上“翻转Z的符号和深度testing”。
这会失去深度精度,但是您不必清除深度缓冲区,而这个深度缓冲区曾经是一个相当慢的操作。 由于深度清除现在不仅免费,而且实际上比这种技术更快,人们不再这样做了。
答案是几乎可以肯定的是,无论使用芯片+驱动程序的任何forms,分层Z只能在一个方向上工作 – 这在当天是相当普遍的问题。 低级别的汇编/分支与它无关 – Z-buffering在固定function的硬件中完成,并且是stream水线的 – 没有任何推测,因此也没有分支预测。
它与高度调谐的组件中的标志位有关。
x86既有jl也有jg指令,但是大多数RISC处理器只有jl和jz(没有jg)。