2011-08-08 129 views
7

(我指定了2.1,因为我的笔记本电脑不会超过这个版本。自从3.x开始,我可能会这样做,并且着重介绍了着色器)。OpenGL 2.1中的顶点缓冲区对象

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

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

+0

完全不相关的评论:如何看待维也纳组织而不是关于IBO,因为它们更简单,如果你了解前者。而在实际应用中,您通常会使用'glDrawElements'而不是'glDrawArrays'。 –

+0

@Christian Rau:我可能没有把我的问题弄清楚,我很好奇我是否需要创建多个VBO而不是一个全局的VBO。 –

+0

我明白(并回答)你的问题。就像Ken说的那样,IBO与维也纳国际组织并没有那么不同或更难。 –

回答

5

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

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

每个对象使用一个VBO可能具有(dis)优点,以及使用单个巨大的VBO可能不是那么好的想法。它只取决于具体的应用以及这些概念如何适合它。但是,一开始,简单的一个 - 每个对象的VBO方法并不是一个坏主意。每个三角形都不要使用一个VBO;)

+0

我能在每个Quad上使用一个VBO和IBO吗?我正在设置一个精灵对象。 –

+0

@Storm您可以使用每个四边形的一个VBO,但是每个绘制调用只能渲染一个四边形,这可能适用于您的精灵对象(仅包含一个四边形)。但是如果你有许多完全相同的精灵(就像在一个粒子系统中一样),这当然就是一个例子,你应该把所有的精灵/粒子打包成一个VBO,这样你就可以一次渲染所有的精灵。就像我说的那样,它取决于具体的应用,粒子系统肯定是有利于VBO的方法之一。 –

+0

这是有道理的。有没有办法为非相似的精灵批量精灵绘制调用?我认为XNA用他们的SpriteBatch来做这件事。 –

2

它应该非常简单 - 只需向VBO添加更多数据即可。因此,例如,如果要渲染3个三角形而不是1个,请确保将9个顶点发送到glBufferData。然后,为了渲染所有这些,请使用调用glDrawArrays(GL_TRIANGLES, 0, 9);它确实应该很简单。

然而,关于IBO的一点是,它们与VBO真的没有多大区别,我真的会习惯使用它们。这实际上是使用维也纳国际组织的实际方式。由于多个三角形通常意味着覆盖相同的表面(例如,一个立方体需要十二个三角形),所以仅使用VBO会导致指定顶点数据的重复。通过使用索引缓冲区,事情更加高效,因为任何重复都从VBO中移除。我发现了this,它提供了一个简单的从VBO转移到VBO/IBO的例子,并给出了一个很好的解释。

+0

这是一个有用的教程谢谢。 –

+0

+1链接到Eddy Luten的书,我真的很喜欢这个项目。 –

+0

是的,我今天刚刚找到了这本书,他的简洁写作风格给我留下了深刻的印象。 –

相关问题