VBO与立即模式性能

时间:2014-09-27 17:40:34

标签: opengl vbo

如果我有一个模型的顶点不断变化,因此我需要每帧重新绑定我的VBO上的所有信息,使用立即模式会更高效吗?或者是所有数据一次传递到GFX卡仍然是VBO的兑换因素?

根据第一个问题的答案,这是否意味着为每个网格保留一个世界矩阵比简单地翻译几何体并重新创建VBO更好?

3 个答案:

答案 0 :(得分:4)

与几乎所有表现问题一样,答案是:这取决于。许多因素都会发挥作用,主要是您的确切使用模式以及OpenGL实现的特征。

虽然立即模式在很大程度上被认为是过时的,并且已从现代OpenGL版本中删除,但如果您的几何图形具有高度动态性,则可能难以在VBO中获得更好的性能。

作为一个案例研究,我一直在做一个爱好项目(1)相当长的时间(并且有很长的休息时间)。在这种情况下,所有顶点坐标都是动态计算的,仅用于渲染一次。最初的版本是使用立即模式,因为它对这种情况很方便,并且当我写它时立即模式还没有完全过时。几年后,当我再次拿起它,并将其移植到Core Profile和ES 3.0时,我最初很难获得同等的性能。

您必须尝试各种选项才能找到最适合您的用例和平台的选项。常见选项包括:

  • 将您的顶点数据写入本地内存,然后批量使用glBufferSubData()将其提供给VBO。
  • 创建一个足够大的VBO,通过使用NULL数据指针调用glBufferData()来保存数据。然后使用glMapBuffer()glMapBufferRange()映射缓冲区内存,并将顶点数据写入映射内存。
  • 对于上一种方法,您可能还想尝试使用多个缓冲区,并循环使用它们,以减少CPU和GPU之间的同步。

关于立即模式如何在当前GPU上运行,存在一种常见的误解(部分反映在其他答案中)。没有当前的GPU(我知道)实际上支持立即模式。当您立即进行模式调用时,驱动程序通常会将顶点数据放入缓冲区,并在稍后将这些缓冲区提交给GPU。因此GPU最终将执行几乎相同的绘图。唯一的区别是,如果您构建缓冲区(通过使用基于VBO的绘图),或者如果您让驱动程序处理它(通过使用立即模式)。

立即模式绘制通常效率低下的主要原因是它需要如此多的API调用,而不是因为GPU最终执行的操作。

(1)无耻的插件,如果有人想知道它是什么:http://retokoradi.com/volume-rendering/

答案 1 :(得分:1)

是的,使用矩阵来转换几何图形几乎总是最好的。顶点着色器将每个顶点乘以一个世界矩阵。它全部采用多线程的GPU,即使在复杂的几何形状上也具有良好的性能。

答案 2 :(得分:1)

VBO会表现更好,因为正如你所说,它会立即将所有数据发送到GPU。如果你使用双缓冲解决方案,你可以更快地运行,你可以在下一帧准备VBO,同时GPU正在处理前一帧中的VBO,因为它不会停止等待来自CPU的更多数据。 / p>

是的,如果您的转换可以通过这样的矩阵充分描述,那么为每个VBO存储单独的世界矩阵会好得多。您将每帧更改较少的数据,从而减少必须通过总线传输到GPU。