2013-04-06 63 views
4

我一直在开发一个使用OpenGL 1.0的Android应用程序,相当一段时间使用一种天真的方法来渲染,基本上调用glColor4f(...)和glDrawArrays(...) FloatBuffers每帧。随着我添加更多的UI元素和绘制调用次数的增加,我正面临图形变成巨大瓶颈的问题。从OpenGL ES 1.0切换到2.0

因此,我现在正在寻找将所有这些调用分组为一个(或两个或三个)绘制调用的最佳方法。它看起来最干净,最高效和规范的方式是使用OpenGL ES 2.0中提供的VBO对象。然而,这将需要我的一个巨大的重构来将我的整个图形后端从ES 1.0切换到ES 2.0。我不确定这是一个好决定,还是有可接受的方法来将我的绘图调用分组在1.0中,这对于相对简单的2D数据(正方形,圆角矩形TRIANGLE_FAN等)来说工作得很好,或者它确实可能是值得咬住子弹并开关。我可能还会提到,我对ES 1.0的固定管道非常方便,对翻译和缩放有很大的依赖。

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

回答

1

我对翻译的严重依赖和缩放

注意不能批什么,如果你改变drawcalls之间模型视图矩阵。 (ES2没有改变这一点)。

vbo a可从opengl ES 1.1获得。它们可能适用于您定位的设备。 Even for ES1.0 (ARB_vertex_buffer_object)

您可以使用世界空间几何创建一个大的VBO(=使用cpu解析缩放和转换)并绘制它。就我个人而言,即使每次更新这个vbo,它都足够快。发送成千上万的小电话几乎总是最慢的。

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

费雯丽

+0

感谢您的想法。我正在采用维也纳组织,将所有在同一视图矩阵上发生的绘图分成尽可能少的电话。 – khiner 2013-04-16 23:23:25