7

(我指定 2.1 是因为我的笔记本电脑不会超过那个版本。我可能会在 3.x 之后将着色器引入强制执行?)。

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

我想知道的是我应该如何在实际环境中使用它们。例如,我所看到的都是设置一个 Vertex Buffer Object 并绘制一个三角形或一个立方体等。如果我想绘制 2 个或更多怎么办?我是否为每个要绘制的实体设置一个新的 VBO?或者我是否神奇地附加到我早期设置的一些静态 VBO?

4

2 回答 2

5

这取决于,因为问题相当广泛。

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

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

于 2011-08-08T15:06:40.753 回答
2

这应该很容易——只需向 VBO 添加更多数据。

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

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

于 2011-08-08T15:04:53.247 回答