Il n'est vraiment pas nécessaire de stocker de la mémoire pour chaque particule et d'animer chaque particule séparément. Vous pouvez le faire de manière procédurale en reconstruisant la position des particules pendant le dessin en utilisant l'équation physique classique. s = ut + 1/2 à ^ 2
Un exemple simple (sans accélération constante des particules):
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();
}
Ensuite, vous augmentez simplement la durée de vie à chaque itération de votre boucle de mise à jour.
Il est également tout à fait prêt à être implémenté sur le GPU, ce qui libère votre CPU de tout travail. Une implémentation gpu pourrait ressembler à ceci:
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);
}
Le vertex shader du GPU reconstruirait alors la position des particules via l'équation physique et les uniformes / constantes qui lui sont passés - tout comme la version CPU.
Pour ajouter une certaine variance, vous pouvez utiliser plus d'explosions simultanées avec des paramètres légèrement différents, animant des couleurs / alpha, choisissant des positions de départ différentes. etc.