Thực sự không cần lưu trữ bộ nhớ cho mỗi hạt và hoạt hình riêng lẻ từng hạt. Bạn có thể thực hiện nó một cách thủ tục bằng cách tái cấu trúc vị trí hạt trong khi vẽ bằng cách sử dụng phương trình vật lý cổ điển. s = ut + 1 / 2.at ^ 2
Một ví dụ đơn giản (không có gia tốc liên tục của các hạt):
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();
}
Sau đó, bạn chỉ cần tăng s.timeElapsed trên mỗi lần lặp của vòng cập nhật của bạn.
Nó cũng hoàn toàn có thể chấp nhận được khi được triển khai trên GPU do đó giải phóng CPU của bạn khỏi phải thực hiện bất kỳ công việc nào. Một triển khai gpu có thể trông như thế này:
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);
}
Bộ tạo bóng đỉnh GPU sau đó sẽ tái cấu trúc vị trí hạt thông qua phương trình vật lý và các đồng phục / hằng số được truyền cho nó - giống như phiên bản CPU đã làm.
Để thêm một số phương sai, bạn có thể sử dụng nhiều vụ nổ đồng thời hơn với các thông số hơi khác nhau, hoạt hình màu sắc / alpha, chọn các vị trí bắt đầu khác nhau. Vân vân.