Android OpenGL ES 纹理动画

标签 android opengl-es

我正在开发一款 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/

相关文章:

android - 将仿真从 32 位更改为 64 位

java - libGDX - 尝试实现 2 个 Sprite 之间的碰撞

ios - 为 OpenGL ES/Cocos2d 优化纹理的方法

带有 viewPager 和选项卡的 java.lang.IllegalStateException Activity

android - 是否需要明确支持AndroidX

opengl-es - 移动物体 Opengl Es 2.0

android - 安卓 : Q texture coordinate not having any effect 上的 OpenGL ES 1.1

ios - 逻辑缓冲区加载 - 缓慢的帧缓冲区加载 - ios

ios - OPENGLES 2.0 PUSHMATRIX POP MATRIX 实现

带有图标的 Android ContextMenu 选项