Smoke is characterized by many small particles that float away from the source, and spread out as they move through the air. We can simulate the floatation effect with particles by using a small upwards acceleration (or constant velocity), but simulating the diffusion of each small smoke particle would be too expensive. Instead, we can simulate the diffusion of many small particles by making our simulated particles change their size (grow) over time.
The following image shows an example of the results:
The texture for each particle is a very light "smudge" of grey or black color.
To make the particles grow over time, we'll make use of the GL_PROGRAM_POINT_SIZE
functionality in OpenGL, which allows us to modify the point size within the vertex shader.
Alternatively, we could draw quads, or use the geometry shader to generate the quads using the technique demonstrated in Chapter 6, Using Geometry and Tessellation Shaders.
Start with the basic particle system presented in the recipe Creating a particle system using transform feedback.
Set the uniform variable Accel
to a small upward value like (0.0, 0.1, 0.0).
Set the uniform variable ParticleLifetime
to about six seconds.
Create and load a texture for the particles that looks like just light grey smudge. Bind it to texture unit zero, and set the uniform ParticleTex
to zero.
Set the uniform variables MinParticleSize
and MaxParticleSize
to 10 and 200 respectively.
Use the following steps:
theta
.uniform float MinParticleSize; uniform float MaxParticleSize;
render
function:subroutine (RenderPassType) void render() { float age = Time - VertexStartTime; Transp = 0.0; if( Time >= VertexStartTime ) { float agePct = age/ParticleLifetime; Transp = 1.0 - agePct; gl_PointSize = mix(MinParticleSize,MaxParticleSize,agePct); } gl_Position = MVP * vec4(VertexPosition, 1.0); }
GL_PROGRAM_POINT_SIZE
:glEnable(GL_PROGRAM_POINT_SIZE);
The render subroutine function sets the built-in variable gl_PointSize
to a value between MinParticleSize
and MaxParticleSize
, determined by the age of the particle. This causes the size of the particles to grow as they evolve through the system.
Note that the variable gl_PointSize
is ignored by OpenGL unless GL_PROGRAM_POINT_SIZE
is enabled.
3.21.76.0