• Advertisement
Sign in to follow this  

Sprite with alpha Blending in 3D world

This topic is 1617 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

Hi,
 

I'm working on a game in a 3D world with elements 2D only (Like Don't starve game) for Android and IOS.

Currently, I've managed "Sprite" without alpha blending, I've just put a condition in the pixel shader to test if pixel alpha channel is null:
 

if ( texture.a < 0.5 ) discard;

Everything working here. (On old devices like an HTC desire mobile, this condition "destroy" framerate but it's another problem :/)
But recently, I've tried to had another Sprite with AlphaBlending activated (The character in the video):

glCheck( glEnable(GL_BLEND) );
glCheck( glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ) );
glCheck( glDisable(GL_DEPTH_TEST) );

My sprite transparency is ok but it is now in front of everything in the scene. (Probably due to glDisable(GL_DEPTH_TEST)).

How can I handle depth with alpha blending activated?

Here is a video to show the problem:
 http://www.youtube.com/watch?v=W0gpBekEwW8&feature=youtu.be

T
hanks for your time!

Share this post


Link to post
Share on other sites
Advertisement

Alpha-blended objects should be sorted back-to-front and then rendered in order after any solid geometry that doesn't use alpha blending. 

Share this post


Link to post
Share on other sites
You have to do this yourself, where my advice would be to do this based on distance of the viewer, using a scaled radius per "object" (in this case sprite)

Share this post


Link to post
Share on other sites

Thanks, I've tried to draw from back to front and it's better!

But I have another question now: If I use static batching I've got one draw call to draw all my scene and one draw call to draw the character, how can I handle alpha blending? 

Share this post


Link to post
Share on other sites

Well, if your scene involves alpha-blending then you can't really do it like that, since all alpha-blended objects need to be drawn back to front. If the scene is solid geometry with no alpha blending, then you can batch it and draw, then draw the character using blending afterward.

Share this post


Link to post
Share on other sites

Just do more draw calls then, that really is the simplest and very probably most efficient solution. Keep all the fully opaque stuff in one batch, though. You could reorder your objects otherwise (read their coordinates and texture atlas IDs from an attribute buffer or a lookup texture or something). There are tricks to do actual order independent transparency too, but they need relatively new hardware and/or are very computationally demanding.

Share this post


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

  • Advertisement