【问题标题】:Is combining instance VBOs a good idea?结合实例 VBO 是个好主意吗?
【发布时间】:2014-12-14 19:37:11
【问题描述】:

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

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

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

【问题讨论】:

  • 我不想说以上任何一个。您能否详细说明实例的含义?您的字面意思是glDrawArraysInstanced (...) 中的实例和实例化数组(例如glVertexAttribDivisor (...))还是其他?你真的不会使用多个 VAO 进行实例绘图,因为 GL 定义了这个术语,因为其想法是在单个绘图调用中对同一数据集做尽可能多的工作。
  • @AndonM.Coleman 我想你可能误解了。我已经按照他们应该的方式设置了实例。我的意思是,无论对象如何,只上传一个 VBO,其中包含所有 VAO 的实例数组。
  • 为什么会有人反对这个,opengl 已经够难了。

标签: opengl vertex-buffer


【解决方案1】:

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

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

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

看一些典型的用例:

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

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

现在,关于这些通用准则,您可能会问的问题之一是:“多”对象到底是什么? “少”和“多”的界限在哪里?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多