Realmente no hay necesidad de almacenar memoria para cada partícula y animar cada partícula por separado. Puede hacerlo procedimentalmente al reconstruir la posición de la partícula durante el dibujo utilizando la ecuación de física clásica. s = ut + 1 / 2.at ^ 2
Un ejemplo simple (sin aceleración constante de partículas):
void drawExplosion(ExplosionParameters& s)
{
Random rng;
rng.seed(s.startSeed);
glBegin(GL_POINTS);
for (int i = 0; i < s.numParticles; i++)
{
vec3 vel = rng.getRandomVector(-1.0f, 1.0f) * s.explosionSpeed;
float timeBias = rng.getRandom(0, s.particleTimeBias);
vec3 pos = s.explosionCentre + (vel * (s.timeElapsed + timeBias));
glPoint3fv(&pos);
}
glEnd();
}
Luego, simplemente aumenta s.timeElapsed en cada iteración de su ciclo de actualización.
También es completamente susceptible de implementarse en la GPU, liberando así a su CPU de tener que hacer cualquier trabajo. Una implementación de gpu podría verse así:
void drawExplosion(ExplosionParameters& s)
{
//bind Vertex Shader If Not Already Bound();
...
// bindVertexBuffer of Zeroes If Not AlreadyBound();
glVertexPointer(...)
//uploadShaderUniformsForExplosion(s);
glUniform3f(...)
...
glDrawArrays(GL_POINTS, 0, s.numParticles);
}
El sombreador de vértices de la GPU luego reconstruiría la posición de la partícula a través de la ecuación física y los uniformes / constantes pasaron a ella, tal como lo hizo la versión de la CPU.
Para agregar alguna variación, puede usar más explosiones simultáneas con parámetros ligeramente diferentes, animando colores / alfa, eligiendo diferentes posiciones de inicio. etc.