ไม่จำเป็นต้องเก็บหน่วยความจำสำหรับทุกอนุภาคและทำให้แต่ละอนุภาคแยกกัน คุณสามารถทำได้โดยการสร้างตำแหน่งของอนุภาคระหว่างการวาดใหม่โดยใช้สมการฟิสิกส์คลาสสิก 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 vertex shader จะสร้างตำแหน่งอนุภาคใหม่ผ่านสมการทางฟิสิกส์และเครื่องแบบ / ค่าคงที่ที่ส่งผ่านไป - เช่นเดียวกับรุ่น CPU
หากต้องการเพิ่มความแปรปรวนบางอย่างคุณสามารถใช้การระเบิดพร้อมกันมากขึ้นด้วยพารามิเตอร์ที่แตกต่างกันเล็กน้อยเคลื่อนไหวสี / อัลฟ่าเลือกตำแหน่งเริ่มต้นต่างกัน เป็นต้น