我的系统由几个表示四边形的对象组成。每个四元组由相同的顶点表示,因此,每个对象只存储表示对象在整个世界中的变换的矩阵,以及它自己的对象空间。在每个渲染过程中,在这些矩阵用帧变换进行更新之后,它们与当前视图和投影矩阵相乘以形成该对象的MVP矩阵。然后将对象顶点与MVP矩阵一起发送给着色器,其中顶点与MVP矩阵相乘。这里的低效率是每个四元组分别绘制,这意味着每个四元组都有一个单独的调用glDrawElements。在任何特定时刻,可能存在50或60个四边形,有些移出范围并被销毁或动画可能完成,因此它们也被破坏,但更多会随机进入存在。在VBO中存储所有必要的值并在每次传递过程中只调用一次glDrawElements会有显着的性能增益吗?在OpenGL ES 2.0中使用VBO进行优化
2
A
回答
1
让我们一下第一个原因与一些简单的数学:
- 在你不需要将任何顶点数据到GPU(每一帧)的时刻,但12-16花车每四矩阵数据,并在CPU上执行每个矩阵的矩阵 - 矩阵乘法。
- 当把所有的VBO放到一个VBO中时,你必须每个四元素转移4个顶点(〜12个浮点数),但是没有矩阵数据(当然除了全局VP),你必须做4个矩阵向量乘(〜 1矩阵 - 矩阵乘)在CPU上。
所以传输的工作量和数据量并没有太大的变化。但是,发生了什么变化呢,即传输的数据是从很多很小的统一更新转移到一个大的VBO更新,这很可能会更快(这是因为缓冲区更新可能比多个统一更新的硬件更快,但不要以此为目标,其次是因为驱动程序开销大大降低)。最重要的是,通过使用单个大型绘图调用代替许多更小的调用,开销更小。
所以是的,它肯定会值得一试,但它必须被评估,如果它真的是一个“重大”改善您的特定应用程序。
1
会不会有一个显著的性能提升到一个VBO存储所有 必要的值,并在 只调用glDrawElements每一次传球?
是的,它会快得多。第一个原因,如你正确识别的,将是一个单独的glDrawElements
呼叫。其次是VBO将数据保存在GPU本身中的事实。
如果四边形移出示波器,您可以重新使用它们的内存来制作新的四边形。 VBO可以用来绘制缓冲区的子区域,所以你可以在没有内存分配的情况下获得很大的灵活性。
通过使用VBO,您可以最大限度地减少与GPU的交互,从而获得性能优势。
相关问题
- 1. OpenGL ES 2.0 VBO问题
- 2. 的OpenGL ES 2.0:与VBO
- 3. OpenGL ES 2.0 - 性能/最优化需要?
- 4. 优化的OpenGL ES 2.0绘图为Android
- 5. opengl es 2.0 - 优化片段着色器
- 6. 使用glDrawElements的OpenGL ES 2.0渲染仅显示一个VBO
- 7. iOS - 需要OpenGL ES 2.0进行升级?
- 8. Libgdx不使用Opengl ES 2.0
- 9. Android OpenGL ES 2.0 - 在onDestroy中使用glDelete *()
- 10. 2D Quads:在Android上使用OpenGL ES 2.0进行翻译
- 11. 在Android上使用opengl es 2.0进行简单的翻译
- 12. 在Opengl ES 2.0中更改Opengl ES 2.0坐标原点
- 13. 在android opengl中优化纹理ES
- 14. 共享内存体系结构中的OpenGL(ES 2.0)VBO性能
- 15. 在OpenGL ES 2.0的
- 16. OpenGL ES 2.0 Alpha
- 17. osmesa OpenGL ES 2.0
- 18. 在opengl es 2.0中的行星旋转
- 19. 在iOS下初始化OpenGL ES 2.0
- 20. iOS - 使用OpenGL ES 2.0进行视频解码
- 21. 如何使用OpenGL ES 2.0/3.0进行计算?
- 22. 在Windows上使用OpenGL ES 2.0入门
- 23. OpenGL ES 2.0:具有GL_STREAM_DRAW的VBO的最有效设置?
- 24. OpenGL ES 2.0:似乎无法呈现第二个VBO?
- 25. OpenGL ES 2.0和顶点缓冲区对象(VBO)
- 26. 在Android中使用VBO与OpenGL ES性能不佳
- 27. 从OpenGL ES 1.1过渡到OpenGL ES 2.0
- 28. OpenGL ES 2.0:glGetAttribLocation返回-1。着色器优化?
- 29. 优化OpenGL ES 2.0的2D纹理输出和帧率
- 30. 在OpenGL ES 2.0中进行缩放和旋转
谢谢基督徒。但是在实现这一点时我正在考虑另一个令人困惑的方面。我以前的实现还为每个四元组传递了一个alpha值作为统一。将所有这些数据存储在一个VBO中可以正常工作,但我需要将alpha值存储到片段着色器中。我知道这样做的唯一方法是在顶点着色器中设置一个变化。但是如果我这样做的话,alpha值将被插值在每个片段上。正确?显然不是我想要的。有什么建议么? –
@JoeyCarson只需将alpha值设置为附加的每个顶点属性,并将其传递给顶点着色器中的变量即可。只要您为单个四边形的每个角使用相同的值,则该值对于该四边形的每个片段都是相同的(因为在1和1之间插值只能导致1,并且变化仅在单个三角形内插值而不是跨越不同的三角形)。而且每个顶点的额外单个值(而不是每个四元组)也不会真正伤害。 –
啊,当然!只要这些值相等,就不可能内插。我想太难了..再次感谢。 –