Android OpenGL ES纹理动画

Android OpenGL ES纹理动画,android,opengl-es,Android,Opengl Es,我正在为android开发一个游戏,这是我第一次使用OpenGL。 当应用程序加载时,我创建顶点和纹理缓冲区,从可绘制资源加载图像;使用GLUtils.tex2Image2D将图像绑定到纹理阵列 我想知道当更改纹理以生成动画时,glBindTexture是否是正确的函数 public void onDraw(GL10 gl){ sprite.animate(); gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[sprite.frameN

我正在为android开发一个游戏,这是我第一次使用OpenGL。 当应用程序加载时,我创建顶点和纹理缓冲区,从可绘制资源加载图像;使用GLUtils.tex2Image2D将图像绑定到纹理阵列

我想知道当更改纹理以生成动画时,glBindTexture是否是正确的函数

public void onDraw(GL10 gl){
    sprite.animate();
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[sprite.frameNumber]);
    sprite.draw(gl);
}
代码解释 sprite.animate-根据System.uptimeMillis更改帧编号

sprite.draw-实际图形是否:

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

该函数确实有效,但我想确认它是正确使用的函数,或者是否有其他方法可以执行此操作。

绑定不同的纹理以制作动画是实现所需操作的一种方法

一种更流行的方法是将所有动画帧放在一个大纹理中,将所有单个帧放在一个大矩形中:要绘制不同的帧,只需更改纹理坐标即可

例如,将四帧动画打包到一个2x2的大正方形中

1|2
3|4

然后,您将使用纹理坐标0,0.5,0.5,0.5,0.50,0.5来显示第1帧,其余的应该是明显的

绑定不同的纹理以设置动画是实现所需操作的一种方法

一种更流行的方法是将所有动画帧放在一个大纹理中,将所有单个帧放在一个大矩形中:要绘制不同的帧,只需更改纹理坐标即可

例如,将四帧动画打包到一个2x2的大正方形中

1|2
3|4

然后,您将使用纹理坐标0,0.5,0.5,0.5,0.50,0.5来显示第1帧,其余的应该是明显的

我假设我需要多个纹理byteBuffers,对吗?在我的绘图函数中使用gl.glTexCoordPointer2、GL10.gl_FLOAT、0、textureBuffer;调用gl.gldrawArray之前;是的,您将需要使用多个纹理坐标缓冲区。您还可以使用所有纹理坐标创建更大的缓冲区,并通过更改gl.gldrawArray中要使用的第一个点的第二个参数来指定要使用的缓冲区。请注意,您需要复制顶点信息才能正常工作。如果我正在为纹理生成mipmap呢?我认为在像1x1或2x2这样的小尺寸MIPAMP上,不同的帧可以混合在一起。glGenerateMipMap函数没有指定最小mipmap大小的参数。我假设需要多个纹理byteBuffers,对吗?在我的绘图函数中使用gl.glTexCoordPointer2、GL10.gl_FLOAT、0、textureBuffer;调用gl.gldrawArray之前;是的,您将需要使用多个纹理坐标缓冲区。您还可以使用所有纹理坐标创建更大的缓冲区,并通过更改gl.gldrawArray中要使用的第一个点的第二个参数来指定要使用的缓冲区。请注意,您需要复制顶点信息才能正常工作。如果我正在为纹理生成mipmap呢?我认为在像1x1或2x2这样的小尺寸MIPAMP上,不同的帧可以混合在一起。glGenerateMipMap函数没有指定最小mipmap大小的参数。