2D Tilemap with OGL

Started by
2 comments, last by hplus0603 18 years, 5 months ago
It might be that this is already covered somewhere in this forum, but my luck with forum search engine wasnt high enough to get results I needed. I want to draw simple 2D Tilemap (top down, non-isometric) with 3D API. For this purpose I use OpenGL and draw tiles as textured quads (GL_QUADS). My problem is that tiled map has glitches while scrolling. It may "jump" if GL_NEAREST mode is used or "blink borders" if GL_LINEAR applied. I have experimented with GL_CLAMP/GL_REPEAT, with setting or not setting the border in glTexImage2D, with different approaches, but still no luck. How do you deal with this problem when you want smooth, glitchless scrolling of your tilemap?
--OK, that''s me and you know it.
Advertisement
I suggest using GL_CLAMP_TO_EDGE. It solved my problem with tile seams(which I assume is your problem).
My Current Project Angels 22 (4E5)
Thank you, I tried GL_CLAMP_TO_EDGE, but it wouldnt solve the glitches completely. I am still stuck with the problem, though its better with GL_CLAMP_TO_EDGE.

I realized I could produce tiles with repeating pattern (repeating rows and columns of pixels at the edges), but it would work only for areas covered with one type of tile only. Which is most unlikely in final game.

Please, add your comment here if you have successfully dealt with this issue.
--OK, that''s me and you know it.
How are you organizing your tiles? One per texture, or in tile sets?
Are you drawing your tiles at 1:1 (i e a 64x64 tile becomes 64x64 on the screen) or with scaling? If scaling, does it become smaller or larger?

Assuming you're drawing your tiles one per texture, then CLAMP_TO_EDGE really should do it, even if you're scaling.

If you use a tile set, then you should get 1:1 pixels to texels; scaling will cause bleeding (and you'll have to pad the tileset itself with additional pixels around the edges). Generate the texture coordinates for a tile as such:

Tile Xt,Yt (with 0 == left and 0 == bottom, for a TGA loaded into GL); total of Wt tiles across and Ht tiles up/down (typically, 8/8 or 16/16).

uleft = Xt/Wtvbottom = Yt/Hturight = (Xt+1)/Wtvtop = (Yt+1)/Ht


Use glOrtho2D() to set the screen into 1:1 match between coordinates and pixels, with 0,0 in the lower-left corner. Then draw a tile at pos Xp,Yp as such:

glTexCoord2f( uleft, vbottom ); glVertex2f( Xp*Wt, Yp*Ht );glTexCoord2f( uright, vbottom ); glVertex2f( (Xp+1)*Wt, Yp*Ht );glTexCoord2f( uright, vtop ); glVertex2f( (Xp+1)*Wt, (Yp+1)*Ht );glTexCoord2f( uleft, vtop ); glVertex2f( Xp*Wt, (Yp+1)*Ht );


That should generate a totally solid set of tiles and pixels. With these settings, filtering or NEAREST shouldn't matter, as you have 1:1 between pixels and texels. You can scroll the entire board by using glTranslatef() on whole pixel coordinates; intermediate texture coordinates will cause filtering, which will require border padding around each tile in the tile set.
enum Bool { True, False, FileNotFound };

This topic is closed to new replies.

Advertisement