是否需要前后绘制才能优化渲染?

时间:2013-03-28 02:24:54

标签: opengl graphics opengl-es 3d opengl-es-2.0

我已经看到偶尔的文章建议在将它们发送到OpenGL(对于任何OpenGL变体)时,将顶点从距离相机最近到最远的位置排序。这样做的原因是,如果顶点位于已经渲染的另一个顶点后面,OpenGL将无法完全处理/渲染顶点。

由于按深度排序顶点是任何项目的昂贵组成部分,因为这种排序通常会发生变化,这种设计有多常见或必要?

我以前认为OpenGL将“查看”提交的所有顶点并处理它们自己的深度缓冲,无论它们的顺序如何,呈现整个批处理之前。但是,如果事实上一个顶点在另一个顶点之前被渲染到屏幕上,那么我可以看到排序如何有益于性能。

优化渲染需要前后绘制吗?

2 个答案:

答案 0 :(得分:9)

一旦基元被栅格化,其z值可用于执行“早期z杀死”,跳过运行片段着色器。这是从前到后渲染的主要原因。提示:当您具有透明(alpha纹理)多边形时,必须从后向前渲染。

OpenGL规范定义了一个状态机,并没有指定渲染实际发生的顺序,只是结果应该是正确的(在一定的容差范围内)。

为了清晰起见编辑:上面我要说的是硬件可以做任何想做的事情,只要基本出现按顺序处理

然而,大多数GPU都是流式处理器,他们的OpenGL驱动程序不会“批处理”几何,除非出于性能原因(最小DMA大小等)。如果您输入多边形A后跟多边形B,则它们将一个接一个地送入管道,并且彼此独立地处理(大部分)。如果在A和B之间有足够数量的多边形,那么A很可能在B之前完成,如果B在A之后,它的碎片将通过“早期z杀死”被丢弃。

为了清晰起见编辑:上面我要说的是,由于hw没有“批量”几何,它不能自动进行前后排序。

答案 1 :(得分:3)

你在这里混淆了一些概念。无需重新排序顶点(*)。但是你应该从前到后画出不透明的物体。这可以在GPU上实现所谓的“早期z拒绝”。如果GPU知道像素不会被z测试遮挡,则不必运行着色器,进行纹理提取等。这适用于绘制调用中的对象,而不是单个对象。

一个简单的例子:你有一个玩家角色和一个天空背景。如果您先绘制播放器,GPU将永远不必对播放器所在的像素进行纹理查找。如果你以相反的方式做到这一点,你首先画出所有的天空然后掩盖它。

透明几何体需要回到前面。

(*)=顶点可以重新排序以获得更好的性能。但是做早期的z对于每个对象来说更为重要和完成。