c) Absolutely go for a vertex shader/program. I don't remember the specific details, but you can highly optimize the data sent for each particle. The idea is to vary the position (3 floats), normal/direction (3 floats) and size (1 or 2 floats) for each particle and automatically generate the final positions in the shader (or sth like that at least). You could even use shorts instead of floats for normal and/or size. You'll find many examples with this technique around the net. It's worth the trouble!