我使用多少个 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?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Java OpenGL VBO 同时显示 2 个项目

使用 OpenGL VBO 绘制数千个多边形

为啥分配大量 VBO 会导致性能问题?

OpenGL - 会使用多个 VBO 减慢渲染速度吗?

更新 VBO 还是使用制服?

OpenGL ES:一个 VBO - 几个精灵 - 每个单独翻译