问题 OpenGL:渲染一批几何体的有效方法?


这是我一直在寻找的东西,但我还没有找到任何具体的信息或好的例子。比方说,我有一堆未连接的对象(例如三角形条)。呈现这些的有效方法是什么?

我听说过在一个VBO中放置几个​​对象来减少openGL调用,但是还没有看到如何做到这一点的正确例子。我也看过与这个想法相矛盾的帖子。所以现在,我大多只是困惑。


1130
2018-01-28 11:03


起源

我刚刚实现了一个概述的方法 craiggiles.wordpress.com/2009/08/03/... 它运作良好。 - RandomEtc


答案:


首先,你应该一直使用VBO。适用于小型和大型物体。

然后,第二个问题是“如何将几个单独的对象组合成一个大对象?” - 这样可以减少必须进行的OpenGL调用次数。通常,可以组合使用相同纹理,材质设置和着色器的对象。例如。如果你周围有大量相同的板条箱,将它们组合成几个较大的“板条箱堆”可能是有意义的。

如果一个对象是一个三角形列表,那么组合很容易 - 只需从源列表中创建一个大的三角形列表。如果一个对象是一个三角形条带,那么你必须使用“退化三角形”来连接条带(如果它不能表示为单个条带,这对于单个对象也是非常有用的优化)。

“简并三角形”是具有两个或三个相同顶点索引的三角形。图形硬件可以识别它们并快速跳过它们。

所以如果你有,例如两个条带,每个条带有一个三角形,总共六个顶点。

条带的原始三角形索引将是:

1) 0, 1, 2
2) 0, 1, 2

现在将所有顶点连接在一起,最终得到6个顶点。

1) 0, 1, 2 (unchanged)
2) 3, 4, 5

到目前为止,您有一个顶点数组,但仍有两个单独的条带。必须通过插入退化三角形来加入它们:

1) 0, 1, 2, 2, 2, 3, 4, 5

(我认为以上是正确的,但实际上没有验证)

这个想法是这样的:使用上面的条带,图形卡将从这些顶点绘制三角形:

0, 1, 2
1, 2, 2 <- degenerate! won't be drawn
2, 2, 2 <- degenerate! won't be drawn
2, 2, 3 <- degenerate! won't be drawn
3, 4, 5

在一般情况下,您必须根据原始条带长度插入两个或三个退化三角形,以便三角形缠绕保持正确。


15
2018-01-28 13:40



为什么不能编译使用GL_TRIANGLE_STRIP的显示列表? - aib
@aib:因为你永远无法确定 什么 编译显示列表。显示列表在OpenGL 3.0中已弃用,并且在大多数其他平台(D3D,OpenGL ES,控制台API,...)上不存在。它们只是不能很好地映射到硬件上。 - NeARAZ
不应该是0 1 2 [2 2 3] 3 4 5?绘制为0 1 2,[2 1 2,2 2,2 2,2 3 3 3 3 3 3 3 4] 3 4 5? - eplawless


调查 glDrawElements(),这是实现你想要的一个好方法。请注意,如果您的数据每帧都更改,性能可能会下降,因为您需要更新数据的相关部分,这意味着将它们复制到图形卡的内存中。对于静态数据,这非常快。


1
2018-01-28 11:21



甚至更好;你现在可以使用glMultiDrawIndirect():) - MattMatt