【问题标题】:OpenGL: efficient way to render a batch of geometry?OpenGL:渲染一批几何图形的有效方法?
【发布时间】:2009-01-28 11:03:53
【问题描述】:

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

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

【问题讨论】:

标签: opengl vbo


【解决方案1】:

首先,您可能应该一直使用 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

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

【讨论】:

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

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

【讨论】:

  • 甚至更好;你现在可以使用 glMultiDrawIndirect() :)
猜你喜欢
  • 1970-01-01
  • 2015-04-16
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2012-12-20
  • 2012-07-27
相关资源
最近更新 更多