我正在开发一款 Android 游戏,这是我第一次使用 OpenGL。 当应用程序加载时,我创建顶点和纹理缓冲区,从可绘制资源加载图像;使用 GLUtils.tex2Image2D 将图像绑定(bind)到纹理数组。
我想知道在更改纹理以生成动画时,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);
该函数确实有效,但我想确认它是正确使用的函数,或者是否有其他方法可以执行此操作。
最佳答案
将不同的纹理绑定(bind)到动画是实现您想要的效果的一种方法。
一种更流行的方法是将所有动画帧放在一个大纹理中(将所有单独的帧打包在一个巨大的矩形中):要绘制不同的帧,只需更改纹理坐标即可。
例如,将四帧动画打包在一个 2x2 的大正方形中
1|2
3|4
然后你将使用纹理坐标 (0,0) (0.5,0) (0.5,0.5) (0,0.5) 来显示第 1 帧,其余的应该是显而易见的。
关于Android OpenGL ES 纹理动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8978845/