4

很长一段时间以来,我一直在使用 OpenGL 1.0 开发一个 Android 应用程序,使用一种幼稚的渲染方法,基本上每帧都使用 FloatBuffers 调用 glColor4f(...) 和 glDrawArrays(...) 。随着我添加更多 UI 元素并且绘制调用的数量增加,我遇到了图形成为巨大瓶颈的地步。

所以我现在正在寻找将所有这些调用分组为一个(或两个或三个)绘制调用的最佳方法。看起来最干净、最有效和最规范的方法是使用 VBO 对象,可从 OpenGL ES 2.0 开始使用。但是,这需要我进行巨大的重构才能将我的整个图形后端从 ES 1.0 切换到 ES 2.0。我不确定这是否是一个好的决定,或者是否有可以接受的方法在 1.0 中对我的绘图调用进行分组,这对于相对简单的 2D 数据(正方形、圆角矩形 TRIANGLE_FAN 等)可以正常工作,或者是否真的可能值得硬着头皮做出改变。我还可能会提到,我非常依赖 ES 1.0 的固定管道非常方便的转换和缩放。

环顾四周,我惊讶地发现几乎没有人在我的位置上谈论这种转换的权衡和复杂性。任何想法?

4

1 回答 1

1

我非常依赖平移和缩放

请注意,如果您在绘制调用之间更改模型视图矩阵,则无法批处理任何内容。(ES2 没有改变这一点)。

Vbo a 可从 opengl ES 1.1 获得。它们可能适用于您的目标设备。即使对于 ES1.0 (ARB_vertex_buffer_object)

您可以使用世界空间几何创建一个大 VBO(=使用 cpu 解决缩放和平移)并绘制它。即使您每帧更新此 vbo,根据我的经验,它也足够快。发送数千个小的 drawcall 几乎总是最慢的。

从固定管道移动到完整的顶点/片段着色器管道一点也不容易。它需要大量的 3d 知识。小心。先写一个原型。(世界空间或物体空间照明?如何转换法线?...)

薇薇安

于 2013-04-16T14:23:29.763 回答