【发布时间】:2014-04-28 16:08:36
【问题描述】:
我正在尝试在 iPhone 上渲染大量带纹理的四边形。为了提高渲染速度,我创建了一个 VBO,我可以利用它在一次绘制调用中渲染我的对象。这似乎运作良好,但我是 OpenGL 的新手,在为我的每个四边形提供独特的变换时遇到了问题(最终我正在寻找每个四边形具有自定义比例、位置和旋转) .
经过大量谷歌搜索后,处理这种情况的标准方法似乎是将统一矩阵传递给顶点着色器,并让每个四边形处理自己的渲染。但这种方法似乎否定了 VBO 的目的,最终要求 每个对象 进行一次绘制调用。
在我看来,每个对象都应该保留自己的模型视图矩阵,并根据需要使用它来变换、缩放和旋转对象。但是将单独的矩阵应用于 VBO 中的对象让我迷失了方向。我考虑了两种方法:
- 将模型视图矩阵作为非统一属性发送到顶点着色器,并在着色器中应用。
- 或者在将顶点数据存储到 VBO 并发送到 GPU 之前对其进行转换
但我发现很难找到有关如何最好地处理此问题的信息这一事实使我相信我混淆了这个问题。处理此问题的最佳方法是什么?
【问题讨论】:
-
我不认为您缺少一个简单的解决方案。您正在考虑的两种方法都是可行的。在您的用例中,每四边形转换的更改频率如何?您是否通常多次使用相同的转换进行绘制,并且很少修改转换?或者转换是否会改变所有/部分四边形的每一帧?
-
转换将相当频繁地更新。我考虑过保留一个带有静态顶点数据的 VBO,并将属性(例如以弧度表示的旋转)传递给顶点着色器——然后我可以在其中生成一个变换矩阵。但我有一种感觉,这可能比简单地在 CPU 上做更昂贵。
-
如果您想确保为您的用例找到性能最佳的解决方案,您可能需要尝试一些方法,并对它们进行基准测试。根据我们掌握的信息,我认为这并不明确。尽管看起来不优雅,但在 CPU 上更新顶点坐标可能比其他方法更好。不幸的是,
glMapBufferRange可以帮助您避免这种方法的副本,它不在 ES 2.0 中。反其道而行之,将更多的计算转移到 GPU 上显然很有吸引力,但您必须确定它是否适合您的使用。
标签: ios opengl-es opengl-es-2.0 vbo