2013-04-17 44 views
2

我的系统由几个表示四边形的对象组成。每个四元组由相同的顶点表示,因此,每个对象只存储表示对象在整个世界中的变换的矩阵,以及它自己的对象空间。在每个渲染过程中,在这些矩阵用帧变换进行更新之后,它们与当前视图和投影矩阵相乘以形成该对象的MVP矩阵。然后将对象顶点与MVP矩阵一起发送给着色器,其中顶点与MVP矩阵相乘。这里的低效率是每个四元组分别绘制,这意味着每个四元组都有一个单独的调用glDrawElements。在任何特定时刻,可能存在50或60个四边形,有些移出范围并被销毁或动画可能完成,因此它们也被破坏,但更多会随机进入存在。在VBO中存储所有必要的值并在每次传递过程中只调用一次glDrawElements会有显着的性能增益吗?在OpenGL ES 2.0中使用VBO进行优化

回答

1

让我们一下第一个原因与一些简单的数学:

  • 在你不需要将任何顶点数据到GPU(每一帧)的时刻,但12-16花车每四矩阵数据,并在CPU上执行每个矩阵的矩阵 - 矩阵乘法。
  • 当把所有的VBO放到一个VBO中时,你必须每个四元素转移4个顶点(〜12个浮点数),但是没有矩阵数据(当然除了全局VP),你必须做4个矩阵向量乘(〜 1矩阵 - 矩阵乘)在CPU上。

所以传输的工作量和数据量并没有太大的变化。但是,发生了什么变化呢,即传输的数据是从很多很小的统一更新转移到一个大的VBO更新,这很可能会更快(这是因为缓冲区更新可能比多个统一更新的硬件更快,但不要以此为目标,其次是因为驱动程序开销大大降低)。最重要的是,通过使用单个大型绘图调用代替许多更小的调用,开销更小。

所以是的,它肯定会值得一试,但它必须被评估,如果它真的是一个“重大”改善您的特定应用程序。

+0

谢谢基督徒。但是在实现这一点时我正在考虑另一个令人困惑的方面。我以前的实现还为每个四元组传递了一个alpha值作为统一。将所有这些数据存储在一个VBO中可以正常工作,但我需要将alpha值存储到片段着色器中。我知道这样做的唯一方法是在顶点着色器中设置一个变化。但是如果我这样做的话,alpha值将被插值在每个片段上。正确?显然不是我想要的。有什么建议么? –

+0

@JoeyCarson只需将alpha值设置为附加的每个顶点属性,并将其传递给顶点着色器中的变量即可。只要您为单个四边形的每个角使用相同的值,则该值对于该四边形的每个片段都是相同的(因为在1和1之间插值只能导致1,并且变化仅在单个三角形内插值而不是跨越不同的三角形)。而且每个顶点的额外单个值(而不是每个四元组)也不会真正伤害。 –

+0

啊,当然!只要这些值相等,就不可能内插。我想太难了..再次感谢。 –

1

会不会有一个显著的性能提升到一个VBO存储所有 必要的值,并在 只调用glDrawElements每一次传球?

是的,它会快得多。第一个原因,如你正确识别的,将是一个单独的glDrawElements呼叫。其次是VBO将数据保存在GPU本身中的事实。

如果四边形移出示波器,您可以重新使用它们的内存来制作新的四边形。 VBO可以用来绘制缓冲区的子区域,所以你可以在没有内存分配的情况下获得很大的灵活性。

通过使用VBO,您可以最大限度地减少与GPU的交互,从而获得性能优势。