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

标签 opengl vbo

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

我听说过将多个对象放在一个 VBO 中以减少 openGL 调用,但还没有看到如何执行此操作的正确示例。我也看到过与这个想法相矛盾的帖子。所以现在,我主要是困惑。

最佳答案

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

那么,第二个问题是“如何将几个独立的对象组合成一个大对象?” - 所以为了减少必须进行的 OpenGL 调用次数。通常,可以组合使用相同纹理、 Material 设置和着色器的对象。例如如果您周围有大量相同的 crate ,将它们组合成几个更大的“ crate 堆”可能是有意义的。

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

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

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

strip 的原始三角形索引将是:

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

现在您将所有顶点连接在一起,最终得到 6 个顶点。
1) 0, 1, 2 (unchanged)
2) 3, 4, 5

现在你有一个顶点数组,但仍然是两个独立的 strip 。必须通过插入退化三角形来加入它们:
1) 0, 1, 2, 2, 2, 3, 4, 5

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

想法是这样的:使用上面的 strip ,图形卡将从这些顶点绘制三角形:
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

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

关于OpenGL:渲染一批几何体的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/487244/

相关文章:

opengl - 上传流媒体点的最快方法,偶尔删除

c++ - opengl vbo dma数组

c++ - glGenBuffers 2 名称?

c++ - 内存池算法

OpenGL 帧率

visual-studio-2010 - 使用 openGL 将 Visual Studio 设置到 Windows 子系统?

c++ - OpenGL在不同的VBO中绘制具有不同颜色、顶点位置和顶点颜色的点?

c++ - OpenGL - 加载多面的正确方法

c++ - 使用 Stencil-buffer 绘制 3D 模型的轮廓

c++ - OpenGL - VAO、VBO、IBO、glDrawElements 不显示