PDA

View Full Version : Particles and Depth Testing



Swiftless
07-01-2005, 12:33 AM
My particles are coded as such:


glDisable (GL_LIGHTING);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_DST_COLOR, GL_ZERO);
glBindTexture(GL_TEXTURE_2D, smoketexture[1]);
particles();
glDisable(GL_BLEND);
Now before that code I have code to build the rest of my scene. The problem with this code is that the particle is drawn on top of the whole scene, when I want it to be drawn infront of what is behind it, yet behind what is infront of it. But if I try to reinstate the GL_DEPTH_TEST it messes up my blending. Any ideas?

And also, how would I implement some more blending afterwards, so that the particles seem to fade accourding to my glColor4f function?

07-01-2005, 01:21 AM
leave depth testing on
but disable depth masking glDepthMask(GL_FALSE)

easiest blend for particles is like
glBlendFunc(GL_SRC_ALPHA,GL_ONE)

which is additive blending (requires no sorting) and your alpha values influence the blend factor

other popular blend is transparency
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)

this however requires that you draw your particles in back to front order (ie furthest from camera first)

Swiftless
07-03-2005, 02:42 AM
Ok, the depth mask fixed that problem. But I am still stuck with the blending using the alpha value. The blending function I am using does the desired result with the image, but does not seem to use the alpha value. I need something that will do the same effect, but use the alpha so I can set how opaque it is.

Swiftless
07-04-2005, 04:27 AM
Anyone? My particles are making smoke, the smoke is black, if I use the options mentioned, the particle becomes white on the screen. I need it black.

Overmind
07-04-2005, 06:08 AM
I think what you need is GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA. But this has the disadvantage that you have to sort the particles for a correct result.

What may work is GL_ZERO, GL_ONE_MINUS_SRC_ALPHA. But this is only for black smoke, because the color of the particle is entirely ignored with this blending mode... It basically darkens the fragment by an amount specified by source alpha. This mode is order independant, no need to sort here.