Es ist wirklich nicht notwendig, Speicher für jedes Partikel zu speichern und jedes Partikel separat zu animieren. Sie können dies prozedural durchführen, indem Sie die Partikelposition während des Zeichnens mithilfe der klassischen physikalischen Gleichung rekonstruieren. s = ut + 1 / 2.at ^ 2
Ein einfaches Beispiel (ohne konstante Teilchenbeschleunigung):
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();
}
Dann erhöhst du einfach bei jeder Iteration deiner Update-Schleife an timeElapsed.
Die Implementierung auf der GPU ist ebenfalls problemlos möglich, sodass Ihre CPU nicht mehr arbeiten muss. Eine GPU-Implementierung könnte folgendermaßen aussehen:
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);
}
Der GPU Vertex Shader rekonstruierte dann die Partikelposition über die Physikgleichung und die an ihn übergebenen Uniformen / Konstanten - genau wie die CPU-Version.
Um eine gewisse Varianz hinzuzufügen, können Sie mehrere Explosionen gleichzeitig mit leicht abweichenden Parametern verwenden, Farben / Alpha animieren und unterschiedliche Startpositionen auswählen. etc.