প্রতিটি কণার জন্য মেমরি সঞ্চয় করার প্রয়োজন নেই এবং প্রতিটি কণাকে আলাদাভাবে অ্যানিমেট করার দরকার নেই। ক্লাসিক পদার্থবিজ্ঞানের সমীকরণটি ব্যবহার করে অঙ্কনের সময় কণার অবস্থানটি পুনর্গঠন করে আপনি প্রক্রিয়াগতভাবে এটি করতে পারেন। 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 বৃদ্ধি করেন।
এটি আপনার সিপিইউকে কোনও কাজ না করা থেকে মুক্ত করে জিপিইউতে প্রয়োগ করাও পুরোপুরি জবাবদিহি। একটি জিপিইউ বাস্তবায়ন এর মতো দেখতে পারে:
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);
}
জিপিইউ ভার্টেক্স শ্যাডার তারপরে পদার্থবিজ্ঞানের সমীকরণের মাধ্যমে কণার অবস্থানটি পুনর্গঠন করে এবং ইউনিফর্ম / ধ্রুবকগুলি এতে চলে যায় - ঠিক যেমন সিপিইউ সংস্করণটি করেছিল।
কিছু বৈকল্পিকতা যুক্ত করতে, আপনি সামান্য বিচ্ছিন্ন পরামিতি, রঙ / আলফা অ্যানিমেট করে, পৃথক পৃথক অবস্থানগুলি বেছে নিয়ে আরও একযোগে বিস্ফোরণগুলি ব্যবহার করতে পারেন। প্রভৃতি