Jump to content
  • Advertisement
Sign in to follow this  

2D z-buffer sorting (2D in D3D9 C#)

This topic is 4536 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I'm creating a tile-based RPG with Direct3D9 and C# using the Sprite interface and have size 32x48 sprites and 32x32 tiles. I would like to draw the sprites based off their y value (bottom draws first) so I can support overlapping sprites. Until I heard of the z-buffer sorting method, I manually compared all sprites and sorted them which is tedious. I enabled the z-buffer and passed the y value as the z value in my draw function and noticed that the buffer only handles values from 0 to 1. I also noticed the higher the z value, the further it's drawn, which is the opposite of what I need. I heard that transparency wouldn't work if I sorted my sprites in this way (not sure if it's true). If anyone knows how to solve this, or a better way to accomplish this, I'm all ears. Thanks.

Share this post

Link to post
Share on other sites

I'm not using z buffer sorting. You can achieve same effect drawing further tiles first and closest tiles last. Same for sprites.
This you can get with two for loops. However, disabling z-buffer in directx you get noticable speed improvements. Just try to disable z-buffering in any D3D application and look at fps counter.

int tilex = 48, tiley =12; // size in pixel of our tile

// tiles visible onscreen
#define MAP_DRAW_WIDTH (19)
#define MAP_DRAW_HEIGHT (50)

//tile coordinate on map
int tMapDrawX = 0;
int tMapDrawY = 0;

for(int y = 0; y<MAP_DRAW_HEIGHT;y++)

for(int x = 0; x<=MAP_DRAW_WIDTH;x++)

// POINT g_ptDrawOffset is scroll offset of tile 0,0
int tMapX = g_ptDrawOffset.x+tMapDrawX+x; //draw coordinates
int tMapY = g_ptDrawOffset.y+tMapDrawY+x;

int index = 0;
index = (tMapY * m_Width) + tMapX;
// MAPDATA[index] store values of tiles

int draw_xpos, draw_ypos;
draw_xpos = g_ptScrollOffset.x+x*xoffset;
draw_xpos = g_ptScrollOffset.x+x*xoffset-(xoffset/2);

draw_ypos = g_ptScrollOffset.y+y*yoffset;

// custom iso draw funcion
BlitIso(m_pDevice, draw_xpos,draw_ypos,48,24,0xffffffff);



static inline bool CHECKEVEN(int num)
if(num/2 == (float)num/2.0f)
return true;
return false;

Hope this helps...

Share this post

Link to post
Share on other sites
Wait... Comparing/sorting out sprites isn't a tedious task, if you know what to use.
All I did was simply use STL's "sort()" method, and created an operator overload for the "graphical" objects. (However, I used STL's "vector" also)

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!