OpenGL 2.1中的顶点缓冲区对象

时间:2011-08-08 14:52:18

标签: c opengl vbo

(我指定了2.1,因为我的笔记本电脑不会超过那个版本。我可能会这样做,因为3.x和on引入着色器是强制性的吗?)。

感谢维基百科:http://en.wikipedia.org/wiki/Vertex_Buffer_Object我开始意识到使用VBO是多么简单(我仍然对IBO没有积极的看法?)。到目前为止我所理解的是使用它们的主要原因是由于数据现在存储在视频内存中而获得性能提升。

我想知道的是我应该如何在实际环境中使用它们。例如,我所看到的所有内容都是设置一个顶点缓冲区对象并绘制一个三角形或一个立方体等。如果我想绘制2个或更多,该怎么办?我是否为要绘制的每个实体设置了一个新的VBO?或者我是否真的附加到我早期设置的静态VBO?

2 个答案:

答案 0 :(得分:5)

这取决于,因为问题非常广泛。

使用一个VBO作为顶点属性,一个用于每个模型/对象/实体/网格的索引是直接的方法。您可以将所有模型存储在单个VBO中,因此您不必经常绑定缓冲区,但是当这些模型不是静态时会带来其他问题。此外,您可以为每个对象使用多个VBO,可能一个用于动态数据,一个用于静态数据,或者一个用于几何数据(位置...),一个用于材料相关数据(texCoords ...)。

每个对象使用一个VBO可能具有(dis)优势,并且使用单个巨大的VBO可能不是一个好主意。它取决于具体的应用程序以及这些概念在其中的适用程度。但是从一开始,直接的每个VBO对象方法并不是一个坏主意。只是不要为每个三角形使用一个VBO;)

答案 1 :(得分:2)

应该非常简单 - 只需向VBO添加更多数据。

因此,例如,如果要渲染3个三角形而不是1个,请确保将9个顶点发送到glBufferData。然后,要渲染所有这些,请使用调用glDrawArrays(GL_TRIANGLES, 0, 9);它应该就这么简单。

然而,有关IBO的一点是,它们与VBO完全没有太大区别,我真的会习惯使用它们。这确实是使用VBO的实用方法。由于多个三角形通常意味着覆盖相同的表面(例如,立方体需要十二个三角形),因此仅使用VBO会在指定顶点数据时引起大量重复。通过使用索引缓冲区,事情甚至更有效,因为从VBO中删除了任何重复。我发现this提供了从VBO到VBO / IBO的简洁示例,并对变化给出了很好的解释。