我使用多少个 VBO?
Posted
技术标签:
【中文标题】我使用多少个 VBO?【英文标题】:How many VBOs do I use? 【发布时间】:2011-12-28 21:42:55 【问题描述】:所以我了解如何使用顶点缓冲区对象,并且它比立即模式绘图提供了很大的性能提升。我将绘制很多 2D 四边形(精灵),我想知道我应该为每个四边形创建一个 VBO,还是创建一个 VBO 来保存所有数据?
【问题讨论】:
【参考方案1】:您不应为每个精灵/四边形使用新的 VBO。因此,在您的情况下,将它们全部放在一个 VBO 中会是更好的解决方案。
但总的来说,我认为这不是一句话就能回答的。
为每个 Quad 创建一个新的 VBO 不会给您带来真正的性能提升。如果你这样做,很多时间将浪费在glBindBuffer
调用切换 VBO 上。但是,如果您创建的 VBO 包含过多的数据,您可能会遇到其他问题。
小型 VBO:
在您的程序代码中通常更容易处理。您可以为您渲染的每个对象使用一个新的 VBO。通过这种方式,您可以在自己的世界中轻松管理对象 如果 VBO 太小(只有几个三角形),您不会获得太多好处。在缓冲区之间切换缓冲区(也可能是切换着色器/纹理)会浪费大量时间大型 VBO:
您可以通过一次drawArrays()
调用渲染大量对象以获得最佳性能。
根据您的数据,在单个 VBO 中管理大量对象可能会产生开销(如果您想移动其中一个对象并旋转另一个对象怎么办?)。
如果您的 VBO 太大,它们可能无法移动到 VRAM 中
以下链接可以帮助您:
Vertex Specification Best Practices
【讨论】:
【参考方案2】:使用一个(或少量)VBO 来保存所有/大部分几何体。
通常,渲染场景所需的 API 调用越少越好。
【讨论】:
【参考方案3】:这也取决于你想对这些精灵做什么?
它们是动态的吗?你想只改变四边形的中心还是修改所有四个点?
这很重要,因为如果您的数据是动态的,那么以最简单的方式,您必须每帧从 cpu 传输到 gpu。也许您可以在 GPU 上执行所有计算 - 例如使用几何着色器?
对于非常简单的四边形/精灵也可以使用 GL_POINT_SPRITE。有了这个,只需要为整个四边形发送一个顶点。但缺点是很难旋转...
【讨论】:
以上是关于我使用多少个 VBO?的主要内容,如果未能解决你的问题,请参考以下文章