13

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

由于按深度对顶点进行排序是任何项目的成本高昂的组成部分,因为这种排序通常会经常变化,所以这种设计有多普遍或必要?

我之前认为 OpenGL 会“查看”所有提交的顶点,并在渲染整个批次之前对它们进行自己的深度缓冲,而不管它们的顺序如何。但如果事实上一个顶点在另一个之前被渲染到屏幕上,那么我可以看到排序如何提高性能。

优化渲染是否需要从前到后绘制?

4

2 回答 2

10

一旦一个图元被光栅化,它的 z 值可以用来执行“early z kill”,这会跳过运行片段着色器。这是从前到后渲染的主要原因。提示:当您有透明(alpha 纹理)多边形时,您必须从后到前渲染。

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

为清楚起见进行编辑:我在上面要说的是,只要基元似乎已按顺序处理,硬件就可以做任何想做的事情

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

为清楚起见进行编辑:我在上面要说的是,由于 hw 不会“批量”几何图形,因此它不能自动进行从前到后的排序。

于 2013-03-28T03:34:55.097 回答
3

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

一个简单的例子:你有一个玩家角色和一个天空背景。如果您先绘制玩家,GPU 将永远不必为玩家所在的像素进行纹理查找。如果你反过来做,你首先画出所有的天空,然后把它遮住。

透明几何当然需要拉回前面。

( * )=顶点可以重新排序以获得更好的性能。但是提前做 z 更重要,并且每个对象都做。

于 2013-03-28T06:53:12.327 回答