从OpenGL ES 1.0升级到2.0

4

我一直在使用OpenGL 1.0开发Android应用,采用了一种简单的渲染方法,每帧基本上都会调用glColor4f(...)和glDrawArrays(...),并使用FloatBuffers。随着添加更多UI元素和绘制调用数量的增加,图形性能成为一个巨大的瓶颈。

因此,我现在正在寻找最佳方法将所有这些调用组合成一个(或两个或三个)绘制调用。看起来,最干净、高效和规范的方法是使用VBO对象,该对象从OpenGL ES 2.0开始提供。然而,这需要我进行巨大的重构,将整个图形后端从ES 1.0切换到ES 2.0。我不确定这是否是一个好决定,或者是否有可以接受的方式来对1.0中的绘制调用进行分组,以适应相对简单的2D数据(正方形、圆角矩形TRIANGLE_FAN等),或者是否真的值得咬紧牙关做出切换。我还要提到,我非常依赖于平移和缩放,这在ES 1.0的固定管道中非常方便。

仔细寻找后,我惊讶地发现几乎没有人像我一样处于这种境地,讨论这种切换所涉及的权衡和复杂性。有什么想法吗?

1个回答

1

我非常依赖翻译和缩放

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

Vbo从opengl ES 1.1可用。它们可能适用于您正在针对的设备。 即使对于ES1.0(ARB_vertex_buffer_object)

您可以使用世界空间几何体(=使用CPU解析缩放和平移)创建一个大的VBO并进行绘制。即使每帧更新此vbo,在我的经验中,它足够快。发送成千上万个小绘制调用几乎总是最慢的。

从固定管道转换到完整的顶点/片段着色器管道并不容易。它需要良好的三维知识。要小心。首先编写一个原型。(世界空间或物体空间照明?如何转换法线?...)

Vivien


感谢您的建议。我正在朝着将所有在相同视图矩阵上发生的绘图批处理成尽可能少的调用,使用VBOs 的方向前进。 - khiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接