我使用了多少个VBO?

时间:2011-12-28 21:42:56

标签: opengl vbo

所以我理解如何使用顶点缓冲区对象,并且它提供了比立即模式绘制大的性能提升。我将绘制很多2D四边形(精灵),我想知道我是否应该为每个创建一个VBO,或者创建一个VBO来保存所有数据?

3 个答案:

答案 0 :(得分:18)

您不应该为每个精灵/四元组使用新的VBO。因此,将它们全部放在一个VBO中将是更好的解决方案。

但总的来说,我不认为这可以用一句话来回答。

为每个Quad创建一个新的VBO不会给你带来真正的性能提升。如果你这样做,那么用glBindBuffer调用切换VBO会浪费很多时间。但是,如果您创建包含太多数据的VBO,则可能会遇到其他问题。

小维管组织:

  • 在程序代码中通常更容易处理。您可以为渲染的每个对象使用新的VBO。通过这种方式,您可以在您的世界中轻松管理您的对象
  • 如果VBO太小(只有几个三角形),你就不会获得太多好处。使用缓冲区之间的切换缓冲区(可能还有切换着色器/纹理)会耗费大量时间

大型维也纳国际中心:

  • 您可以通过一次drawArrays()调用来渲染大量对象,以获得最佳效果。
  • 根据您的数据,您可能会为在单个VBO中管理大量对象创建开销(如果您想移动其中一个对象并旋转另一个对象,那该怎么办?)。
  • 如果你的VBO太大,可能无法移入VRAM

以下链接可以为您提供帮助:

Vertex Specification Best Practices

答案 1 :(得分:1)

使用一个(或少量)VBO来保存所有/大部分几何体。

通常,渲染场景所需的API调用越少越好。

答案 2 :(得分:1)

这还取决于你想用这些精灵做什么?

他们有活力吗?你想只改变四边形的中心还是修改所有四个点?

这一点非常重要,因为如果您的数据是动态的,那么最简单的方法就是每帧必须从cpu转移到gpu。也许你可以在GPU上执行所有计算 - 例如使用几何着色器?

对于非常简单的四边形/精灵,也可以使用GL_POINT_SPRITE。有了这个,只需要为整个四边形发送一个顶点。但缺点是它很难旋转......