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

10

我正在渲染一些网格(有时多达500个),我想知道最好的处理方法是什么。是否创建500个VBO并在它们通过视锥体和可见性测试后渲染它们是无意义的?有没有更高效的方法来完成这项工作?我想要最大化性能。

1个回答

11

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

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

一旦将缓冲区减少到可能的最小值,您将想要使用多种裁剪。能见度,通过视锥体(也许在八叉树中)和遮挡,可以提供显著的性能提升。主要思想是尽快简单地淘汰几何图形,因此您从粗略测试开始(八叉树),然后进行稍微详细的测试(也许是AABB和/或简化的外壳),然后进行遮挡,最后再进行绘制。

这是一个关于视锥体裁剪的好文章,涉及一些四叉树(以及八叉树)。图示、解释和一些示例代码。

OpenGL遮挡裁剪文章似乎较少,虽然这篇来自GPU Gems的文章可能是一个好的起点。


1
谢谢您的回复。我正在使用二叉树进行视锥体剔除,它运行良好。我只是更关注的是,拥有500个缓冲区会破坏与VBO相关的速度提升的本质。 - Donkis Purb
1
只是为了避免你误解:通常使用多个VBO是有优势的(每次使用几十个),因为它允许GPU在上传另一个VBO时从一个VBO中绘制,而且在GPU内存和主内存之间移动数据(驱动程序有时必须这样做)也会更有效率,更新数据也是如此。正如peachykeen指出的那样,拥有数百个VBO意味着需要多次改变状态,这最终是不利的。 - Damon
2
是的,VBO很好(如果有避免发送几何图形到每一帧的方法,你就不应该这样做),但是拥有太多缓冲区可能会导致内存不足错误,并且会显著影响性能。我不确定500个是否“太多”,但它已经足够接近极限了,你可能需要考虑减少它们。 - ssube
谢谢你们两个再次回复。我非常感激! - Donkis Purb

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