Non è necessario archiviare la memoria per ogni particella e animarla separatamente. Puoi farlo proceduralmente ricostruendo la posizione delle particelle durante il disegno usando la classica equazione fisica. s = ut + 1 / 2.at ^ 2
Un semplice esempio (senza costante accelerazione di particelle):
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();
}
Quindi semplicemente aumenti s.timeElapsed su ogni iterazione del tuo ciclo di aggiornamento.
È anche completamente suscettibile di essere implementato sulla GPU, liberando così la tua CPU dal dover fare qualsiasi lavoro. Un'implementazione di gpu potrebbe assomigliare a questa:
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);
}
Lo shader di vertice GPU ricostruirà quindi la posizione delle particelle tramite l'equazione fisica e le uniformi / costanti passate ad essa - proprio come faceva la versione CPU.
Per aggiungere una certa varianza, puoi usare più esplosioni simultanee con parametri leggermente diversi, animando colori / alfa, scegliendo diverse posizioni di partenza. eccetera.