我见过偶尔文章建议将它们发送到OpenGL的(任何的OpenGL的变种)当从最近从相机订购您顶点最远。 此建议的原因是,OpenGL的将不能完全处理/渲染顶点,如果它的背后是已经呈现另一顶点。
由于通过深度排序顶点是任何项目的一个昂贵的部件,因为通常这种排序变化频繁,如何共同或必要的是这样的设计呢?
我以前认为的OpenGL会“看”提交的所有顶点并处理他们自己的深度缓冲,不论其顺序,使整批前 。 但是,如果实际上是一个顶点被另一个之前渲染到屏幕上,然后我可以看到订货会如何受益的性能。
正在起草前到后的必要的优化渲染?
一旦一个基元被光栅化,它的Z值可以用来做一个“早期Z轴杀”,这会跳过运行片段着色器。 这就是呈现前到后的主要原因。 提示:当你有透明的(阿尔法纹理)多边形,你必须使后端到前端。
OpenGL的规范定义的状态机,并没有明确规定什么样的顺序呈现实际情况,只表示结果应该是正确的(一定的限度内)。
编辑清晰:我想要上面说的是硬件可以为所欲为,只要原语似乎都在为了被处理
然而,大多数的GPU是流处理器和他们的OpenGL驱动程序不“批了”几何,也许除了性能方面的原因(最小尺寸DMA等)。 如果在多边形A,接着多边形B饲料,然后将它们送入管道一个在另一个之后和彼此独立地进行处理(在大多数情况下)。 如果有A和B之间的多边形的数量充足,则有B之前一个很好的机会,A完成,如果B组在背后,其碎片将通过“早期Z轴杀”被丢弃。
编辑清晰:我想要上面说的是因为硬件不“批了”几何形状,它不能做前端到后端自动排序。
您在这里混淆了几个概念。 有没有必要重新整理顶点(*)。 但是,你应该绘制不透明从前向后的对象。 这使得所谓的“早期Z轴拒绝”在GPU上。 如果GPU都知道,像素是不会由z检验它没有运行着色器阴影,做纹理拾取等。这适用于对象绘制调用虽然不是单个对象。
一个简单的例子:你有一个玩家角色和天空背景。 如果你先画出球员中,GPU将永远不会有做玩家为像素纹理查找。 如果你身边做它的其他方式,你先画出整个天空,然后掩盖它。
透明的几何需要借鉴回到当然前面。
(*)=顶点可以被重新排序为更好的性能。 但这样做早期z是更重要的,每个对象来完成。