Benar-benar tidak perlu menyimpan memori untuk setiap partikel dan menghidupkan setiap partikel secara terpisah. Anda dapat melakukannya secara prosedural dengan merekonstruksi posisi partikel selama menggambar dengan menggunakan persamaan fisika klasik. s = ut + 1 / 2.at ^ 2
Contoh sederhana (tanpa percepatan partikel konstan):
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();
}
Maka Anda cukup meningkatkan s.timeElapsed pada setiap iterasi dari loop pembaruan Anda.
Hal ini juga sepenuhnya dapat diterapkan pada GPU sehingga membebaskan CPU Anda dari keharusan melakukan pekerjaan apa pun. Implementasi GPU mungkin terlihat seperti ini:
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);
}
Vertikal shader GPU kemudian akan merekonstruksi posisi partikel melalui persamaan fisika dan seragam / konstanta diteruskan ke sana - sama seperti versi CPU.
Untuk menambahkan beberapa variasi, Anda dapat menggunakan ledakan lebih simultan dengan parameter yang sedikit berbeda, menganimasikan warna / alfa, memilih posisi awal yang berbeda. dll.