Recently been getting to grips with Cinder, OpenGL and GLSL for a project. I managed to get close to a million particles drawing at around 60fps
Here’s what I did to achieve this:
Firstly I created a VBO mesh that contained randomly positioned vertices (each vertex represented a root particle position).
Using VBO meshes mean you don’t have to upload the geometry before every draw call- it gets uploaded to the GPU once, then you can transform and draw the referenced mesh in your render loop.
Once i had the VBO mesh, I created vertex and fragment shaders that accept GL_POINTS as the input and output types. This means the vertex shader is expecting a bunch of vertices and the fragment shader is expecting to draw a single points to the screen.
The clever thing is, you can flick a switch in OpenGL to enable point sprites, this means you can tell the fragment shader to draw a texture at the point instead.
You can also tell the vertex shader what size each point sprite should be rendered at based on its distance from the camera
Using point sprites is fast, because there are no triangles or textures that need mapping to them- the fragment shader just renders the texture at a given screen position and at the size you have specified.
FAST FAST FAST!!!!!