For our final graphics project, Jayme Woogerd and I implemented a configurable particle system in C using OpenGL buffer objects, instancing, and GLSL shaders.
We started by using fixed-pipeline OpenGL, rendering each particle as a point. Most of the parameters are configurable, including the number of particles generated, the randomness spread, camera direction, and location of particle generation, and the physical forces.
We then added vertex buffer objects and instancing. Instancing allows us to define a single two-dimensional template billboard, shared by all particles. This 2-dimensional image is rotated to always face the camera - giving the illusion that the particles are 3-dimensional, while keeping the rendering fast.
Attributes that are unique to a given particle (such as size, color, position and age) are stored and sent to the GPU via buffer objects.
Finally, we used the GL shader language to implement different texture maps and animations.