TerryProbert
TerryProbert

Reputation: 1134

Android OpenGL ES texture animation

I'm developing a game for android and this is my first experience with OpenGL. When the application loads I create my vertices and texture buffers, I load images from drawable resources; using GLUtils.tex2Image2D to bind the image to a texture array.

I was wondering if glBindTexture() was the correct function to use when changing the texture to produce animation.

public void onDraw(GL10 gl){
    sprite.animate();
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[sprite.frameNumber]);
    sprite.draw(gl);
}

Code Explanation

sprite.animate() - changes the frame number depending on System.uptimeMillis()

sprite.draw() - does the actual drawing:

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);

The function does work, but I wanted to confirm it was the correct function to use, or if there is an alternative way to do this.

Upvotes: 2

Views: 4142

Answers (1)

Alexis Andre
Alexis Andre

Reputation: 141

Binding a different texture to animate is one way to do what you want.

A more popular way of doing this is to have all your animations frames in a big texture (pack all the individual frames in a huge rectangle): to draw a different frame, just change the texture coordinates.

For example, pack four frames of animation in a big 2x2 square

1|2
3|4

Then you'll use for texture coordinates (0,0) (0.5,0) (0.5,0.5) (0,0.5) to display frame 1, and the rest should be obvious.

Upvotes: 4

Related Questions