Pseudo volumetric smoke particles

On nvidia’s forums, Kevin Pazirandeh wrote :

"I am a student at RIT and over the last quarter and an independant study I developed an amateur game engine. Among all the typical things, it has a particle system. A big part of my goal was to get rid of the flat smoke look that sprites consistantly deliver. Besides rallysport challenge 2, I have seen little effort to bring particles out of the 2nd dimension.

I have developed the system using PS model 2 and 3. The model3 is quite a bit faster as it does not need to be rendered in 1 pass per light, though it has a cap of 7 lights per pass due to register limitation. And… well… here are some screens, and a video of the game and the particles in action.

note the particle effects are exaggerated, at the worst it dips down to 20fps on my 6600gt.

On a side note i’m looking for an internship/co-op revolving around graphics for this summer and beyond. I’d be greatful for any suggestions.


if the picture doesn’t show just click:"

He goes on disclosing a bit of his technique :

"First, there are about 200-300 particles in that scene by my estimate. They are not normal mapped, but normals are the trick here to making them look round. The reason it drops to 20fps (besides the use of control statements) and an answer to another question, is this is user controlled, it is a game through and through, the video is of me playing. there are dozens of collision queries a frame along with all the consequences of a game with scripting and user defined actions. I don’t have the experience to know all the ins and outs , it is however in no way sloppy.

The basic jist of how its done is this. The partices are normal 2 face, camera facing squares. Howerver, the normals at these 4 verts are pretty much facing away from the center of the sprite. The texture is a simple smokey cloud texture i made in ps, however these particles are not rendered 1 by one. For each emitter they are all compiled into one big vertex buffer and popped off to the shader. Now there is a lot more trickery in the shader/vertex buffer, as the current color and life of each particle is stored in the vertex format. Then we do a simple diffuse calculation per light and a few other tweeks and boom.

At the beginning, the normal generation and lighting calculations were done per pixel, many things have been migrated to the per-vertex level and with little quality loss (after hours of tweaking). However to simulate some lighting effects the alpha of the texture is used to modulate the lighting of that area in a way that is not purely linear.

Also the color and alpha of the particle determines how “lightable” it is, meaning an alpha value of 4 is not a mistake, but a tequnique to making it sonewhat self ilumminating, and then fade into smokeyness. there is a lot of room for artist control
in the appearance of these guys.

I hope this answers a few questions, excuse me for not spelling out my techniques, I’d like to encourage others to have their own go, and most likely improve on the concept, I find that if i read about a cool idea i have a hard time thinking away from it or improving on it."

Interesting how it gives great visuals.

His site links to binaries including source :


The videos look nice, but the executable crashes randomly, and pressing the space bar just closes it.