प्रत्येक कण के लिए स्मृति को स्टोर करने और प्रत्येक कण को अलग से चेतन करने की वास्तव में कोई आवश्यकता नहीं है। आप इसे क्लासिक भौतिकी समीकरण का उपयोग करके ड्राइंग के दौरान कण की स्थिति का पुनर्निर्माण करके प्रक्रियात्मक रूप से कर सकते हैं। s = ut + 1 / 2.at ^ 2
एक सरल उदाहरण (कणों के निरंतर त्वरण के बिना):
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();
}
तो आप बस अपने अद्यतन लूप के हर पुनरावृत्ति पर s.timeElapsed बढ़ाएँ।
यह भी पूरी तरह से GPU पर लागू किया जा रहा है इस प्रकार अपने CPU किसी भी काम करने से मुक्त किया जा रहा है। एक gpu कार्यान्वयन इस तरह लग सकता है:
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 वर्टेक्स shader फिर भौतिकी समीकरण और इसके माध्यम से वर्दी / स्थिरांक के माध्यम से कण स्थिति को फिर से संगठित करेगा - जैसा कि सीपीयू संस्करण ने किया था।
कुछ भिन्नताएँ जोड़ने के लिए, आप भिन्न भिन्न मापदंडों के साथ अधिक समकालिक विस्फोटों का उपयोग कर सकते हैं, रंग / अल्फा को अलग कर सकते हैं, भिन्न आरंभिक पदों को चुन सकते हैं। आदि।