在OpenGL中移动精灵的最佳方法 - 转换或改变顶点

use*_*404 5 graphics opengl-es

我正在使用openGL ES为Android创建一个应用程序.我试图在2D中绘制许多在屏幕上反弹的移动精灵.

让我们考虑我在坐标100,100处有一个球.球图形是10px宽,因此我可以创建顶点boundingBox = {100,110,0, 110,110,0, 100,100,0, 110,100,0}并在每个循环上执行以下onDrawFrame()加载球纹理.

//for each ball object
FloatBuffer ballVertexBuffer = byteBuffer.asFloatBuffer();
ballVertexBuffer.put(ball.boundingBox);
ballVertexBuffer.position(0);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ballVertexBuffer); 
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0,4);
Run Code Online (Sandbox Code Playgroud)

然后我会更新boundingBox阵列以在屏幕上移动球.

或者,在绘制顶点之前,我根本无法改变球bounding box而是translatef()

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, ballVertexBuffer); 
gl.glPushMatrix();
gl.glTranslatef(ball.posX, ball.posY, 0);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0,4);
gl.glPopMatrix();
Run Code Online (Sandbox Code Playgroud)

在效率和最佳实践方面,最好的做法是什么.

dat*_*olf 1

绘图调用比更改数据要昂贵得多。此外,glTranslate 的效率远不如仅添加几个数字那么高效,毕竟它必须经过完整的 4\xc3\x974 矩阵乘法,即 64 次标量乘法和 16 次标量加法。

\n\n

当然,最好的方法是使用某种形式的实例化。

\n