Her parçacık için bellek depolamaya ve her parçacığı ayrı ayrı canlandırmaya gerçekten gerek yoktur. Klasik fizik denklemini kullanarak çizim sırasında parçacık pozisyonunu yeniden yapılandırarak prosedürel olarak yapabilirsiniz. s = ut + 1 / 2.at ^ 2
Basit bir örnek (parçacıkların sürekli hızlanması olmadan):
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();
}
Daha sonra güncelleme döngünüzün her yinelemesinde s.timeElaed öğesini basitçe arttırırsınız.
Ayrıca GPU'ya uygulanmaya tamamen uygundur, böylece CPU'nuzu herhangi bir iş yapmak zorunda bırakmaz. Bir gpu uygulaması şöyle görünebilir:
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);
}
GPU tepe gölgeleyici daha sonra parçacık konumunu fizik denklemi aracılığıyla yeniden yapılandırır ve üniformalar / sabitler - tıpkı CPU sürümü gibi.
Biraz sapma eklemek için, farklı başlangıç pozisyonları seçerek, renkleri / alfa animasyonunu canlandıran, biraz farklı parametrelerle daha eşzamanlı patlamalar kullanabilirsiniz. vb.