组合实例 VBO 是个好主意吗?



以下哪个选项更适合每个实例的数据?

  • 一个巨大的 VBO,其中包含每个对象的位置,由所有 VAO 共享,每个 VAO 都有偏移量和长度
  • 每个 VAO 一个 VCO,其中只有其顶点数据的实例位置。
  • 更花哨的东西,比如一个巨大的 VBO 用于静态对象,一个较小的 VBO 用于移动对象

我没有使用多个 VAO 来绘制一组实例。我的意思是跨多个 VAO 的多组实例。

实际上,没有一种方法在所有情况下都是最好的。如果只有一种方法总是表现最好,像OpenGL这样的API就不会提供所有这些灵活的选项。

一些影响最佳因素的因素:

  • 平台的性能特征。
  • 绘制的对象数。
  • 绘制对象的大小(顶点数(。
  • 如果所有对象都绘制在每一帧中,或者只绘制一个(小(子集。
  • 修改顶点数据是否以及修改频率。

看看一些典型的用例:

  • 相对较少的大型对象:无论您做什么,VBO 绑定和绘制调用都可能不是瓶颈。 如果这是最方便的方法,则为每个对象使用单独的 VBO 是可以的。
  • 大量小对象:在同一 VBO 中存储对象组可能是有益的。可能还想研究使用单个绘制调用绘制相关对象组的方法。
  • 每帧中只绘制"世界"的一小部分,例如玩家在房间之间切换的游戏:将对象分组到 VBO 中时,同时绘制的对象(例如同一房间中的对象(应位于同一 VBO 中,而从不在同一时间绘制的对象应位于不同的 VBO 中。
  • 点的子集经常被修改:将"动态"顶点保留在单独的 VBO 中,并保持其他 VBO 完全静态可能是有益的。

在所有这些情况下,如果您有相同对象类型的多个实例,即具有相同几何体的对象,您当然希望在它们之间共享顶点数据。

现在,您可能会问的有关这些通用准则的一个问题是:究竟什么是"许多"对象?"少"和"多"的界限在哪里?

答案在很大程度上取决于硬件/平台的性能特征。为了至少给出一个粗略的数量级,我希望最常见的平台能够处理100,000到几百万个VBO交换机,并且每秒绘制调用。如果您将其除以 60 fps 的目标,并希望避免将大部分总性能预算花费在这一领域,我会开始担心在较低性能平台上每帧大约 1000 个 VBO 绑定和绘制调用的数量,而高性能平台可能不会出汗,如果您至少高出一个数量级。

最新更新