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

Posted

技术标签:

【中文标题】OpenGL - 会使用多个 VBO 减慢渲染速度吗?【英文标题】:OpenGL - Will using multiple VBO's slow down rendering? 【发布时间】:2011-07-06 18:15:38 【问题描述】:

我正在渲染一些网格(有时超过 500 个),我想知道解决这个问题的最佳方法。创建 500 个 VBO,然后如果它们通过了截锥体和可见性测试,那么渲染它们是否毫无意义。有没有更有效的方法来做到这一点?我希望最大限度地提高性能。

【问题讨论】:

【参考方案1】:

要回答您的问题,是的,许多 VBO 会放慢速度。更多的多边形通常会减慢渲染速度,但更多的绘制调用会产生更大的影响。您希望最大限度地减少状态更改和绘制,以及您拥有的缓冲区数量(和内存使用)。

我建议首先查看缓冲区并确定需要多少。如果您可以批处理/实例化几何体、将静态几何体合并到单个缓冲区、更有效地重用缓冲区等。

一旦您将缓冲区减至最少,您将需要使用多种类型的剔除。通过平截头体(可能在八叉树中)和遮挡的可见性可以提供显着的性能提升。主要想法是尽可能快速和简单地取消几何体的资格,因此您从粗略测试(八叉树)开始,然后更详细(可能是 AABB 和/或简化的船体),然后是遮挡,然后实际绘制。

这是一个good article on frustrum culling,它涉及到四叉树(以及扩展的八叉树)。图表、解释和一些示例代码。

OpenGL 遮挡剔除文章似乎不太常见,尽管this one from GPU Gems 可能是一个不错的起点。

【讨论】:

感谢您的回复。我正在使用二叉树进行截锥剔除,它工作正常。我只是更担心这样一个事实,即拥有 500 个缓冲区会破坏与 VBO 相关的速度增益的整个本质。 这样您就不会弄错了:一般使用多个 VBO 是有利的(一次几十个),因为它允许 GPU 从一个同时上传另一个,在 GPU 内存和主内存之间移动数据(驱动程序有时必须这样做)也会更有效,更新数据也是如此。正如 peachykeen 指出的那样,拥有数百个意味着改变状态数百次,这最终是有害的。 是的,VBO 很好(如果有办法避免的话,你永远不应该在每一帧都发送几何图形),但是有太多的缓冲区会导致内存不足错误并严重影响性能。我不确定 500 是否太多,但它的推动力足以让您考虑削减它。 再次感谢两位的回复。我真的很感激!

以上是关于OpenGL - 会使用多个 VBO 减慢渲染速度吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBO 渲染顶点的问题 - OpenGL

OpenGL 多个 VBO 只渲染一个

opengl交错vbo不渲染到屏幕

在 OpenGL ES 2 中实现 VBO 以渲染精灵

opengl vbo 纹理

OpenGL 在渲染帧之前崩溃 - VBO