我需要使用多少个VBO?

11

我了解如何使用顶点缓冲对象(Vertex Buffer Object),并且知道它比即时绘制提供了更好的性能。我将要绘制很多2D四边形(精灵),想知道应该为每个精灵创建一个VBO,还是创建一个包含所有数据的VBO?

3个回答

19
你不应该为每个精灵/四边形使用新的VBO。因此,在你的情况下把它们都放在一个单独的VBO中会是更好的解决方案。
但是,一般来说,这不能用一句话回答。为每个四边形创建一个新的VBO并不会给你带来真正的性能提升。如果这样做,将浪费大量时间用于glBindBuffer调用切换VBO。然而,如果你创建的VBO包含的数据太多,也可能遇到其他问题。
小型VBO:
  • 通常在程序代码中更容易处理。你可以为渲染的每个对象使用一个新的VBO。这样你就可以在你的世界中轻松管理你的对象。
  • 如果VBO太小(只有几个三角形),你不会获得很多好处。在缓冲区之间(可能会在着色器/纹理之间)切换缓冲区需要耗费大量时间。
大型VBO:
  • 你可以用一个单独的drawArrays()调用渲染大量对象以获得最佳性能。
  • 根据你的数据,可能会在一个单独的VBO中管理大量对象而产生开销(如果你想移动一个对象和旋转另一个对象怎么办?)。
  • 如果你的VBO太大,可能无法移动到VRAM中。
以下链接可能对你有帮助: 顶点规范最佳实践

1

使用一个(或少量)VBO 来存储大部分或全部几何图形。

通常情况下,渲染场景所需的 API 调用次数越少,效果越好。


1

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

它们是动态的吗?你只想改变四边形的中心还是可能修改所有四个点?

这很重要,因为如果你的数据是动态的,那么最简单的方法就是每帧从CPU传输到GPU。也许你可以在GPU上执行所有计算-例如使用几何着色器?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接