Sign in to follow this  
storm33229

OpenGL 2D Animation in OpenGL

Recommended Posts

I've done a little searching on the forums here, but couldn't quite find any one post that outlined how to animate 2d sprites in OpenGL. I have figured out how to clip a part of a texture and assign it to a quad. This would give me a single frame of a spritesheet, and obviously knowing how to do this would make it rather simple to make sprites animate. The trouble is that because I am using TexCoords I do not know how to select certain pixel rects of a sprite sheet to draw. For example:



[font="Consolas"][size="2"]glClear(GL_COLOR_BUFFER_BIT);[/size][/font]
glLoadIdentity();
glBindTexture(GL_TEXTURE_2D, tex);
glBegin(GL_QUADS);
glTexCoord2f(0.5, 0.5);
glVertex3f(0.25, 0.25, 0.0);
glTexCoord2f(1.0, 0.5);
glVertex3f(0.5, 0.25, 0.0);
glTexCoord2f(1.0, 1.0);
glVertex3f(0.5, 0.5, 0.0);
glTexCoord2f(0.5, 1.0);
glVertex3f(0.25, 0.5, 0.0); [font="Consolas"][size="2"]
[/size][/font]
[font="Consolas"][size="2"]glEnd();[/size][/font]

This code will draw a texture that starts halfway through and displays the other half so:
OOOO
OOOO
OOXX
OOXX

(or at least that is how I imagine it)

Anyway using TexCoords like this does not seem to be a good way to select which part of a sprite sheet i would like to draw. Are there better ways of doing this?

Share this post


Link to post
Share on other sites
[quote name='storm33229' timestamp='1312662188' post='4845528']
Anyway using TexCoords like this does not seem to be a good way to select which part of a sprite sheet i would like to draw. Are there better ways of doing this?
[/quote]

There may be another way through the use of texture matrix, but it is impractical.

You can easiliy convert from your pixel coordinates to texture coordinates and back: you know actual texture dimensions in pixels and your sprite locations/dimensions.
For a sprite with pixel geometry (x,y,width,height) texture coords would be (x/TextureWidth,y/TextureHeight,(x+w)/TextureWidth,(y+h)/TextureHeight). I'm sure you can quickly come up with a backwards conversion should you need one.

Share this post


Link to post
Share on other sites
If you know the pixel locations and widths of the sprite, and the dimensions of the texture, you can easily calculate the texture coordinates. ie, given a sprite sheet sized 1024x1024, the sprite at location (256,256) of size 64x64 would be defined by the texture coordinate rectangle (0.25,0.25) - (0.3125,0.3125). It's just a matter of simple division. Each pixel in a 1024x1024 image is equalt to 1/1024 or 0.0009765625 and (1/1024)*256=0.25.

Share this post


Link to post
Share on other sites
SpriteSheets are the way to go. In my 2D Engine, I use this Tool:
[list][*][url="http://spritesheetpacker.codeplex.com/"]SpritesheetPacker[/url][/list]Very nice and easy to use, even has a commandline tool coming with it.
Implementation for a parser of the format:
http://code.google.com/p/nightlight2d/source/browse/NightLightDLL/NLSpriteSheet.cpp

And animating is just flipping the texture-coords.
In my code, I just keep all frames in a vector, which are described in a xml document and all frames live on the same spritesheet.
Then every X seconds or frames I flip the texture-coords of the sprite and voilá, decent animation :).

[url="http://code.google.com/p/nightlight2d/source/browse/NightLightDLL/NLAnimation.cpp"]http://code.google.c...NLAnimation.cpp[/url]
Thats the code without drawing the sprite, that is done in another class since this is a derived class only. But could give a clue about how to do it.
The code should be easy to understand.
Believe me, Spritesheets really speed you up and flipping the texture-coords is the most efficient way you can have when doing pic-by-pic animations.
Thats at least what I researched.

Share this post


Link to post
Share on other sites
Awesome, thank you for your help. Now I am on to learning how to NOT use Immediate mode. [img]http://public.gamedev.net/public/style_emoticons/default/rolleyes.gif[/img]

Share this post


Link to post
Share on other sites
Another way to do it would be to load each frame of animation into layers of a 3D texture. Then to 'play' the animation you just interpolate the w texture coordinate. I'm not sure how efficient this is vs. jumping around a 2d texture but it means you can take advantage of texture filtering between frames.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this