opengl粒子系统的简单实现
Particle表示一个粒子 struct Particle { Vector3f<float> position;/**< 粒子的位置 */ Vector3f<float> color; /**< 粒子的颜色 */ Vector3f<float> v; /**< 粒子的速度(x,y,z方向) */ Vector3f<float> g; /**< 粒子在x,y,z上的加速度 */ Vector2f<float> lt; /**< 粒子生命值 *//**< 粒子消失的速度 */ }; //生成每一个粒子的属性 for (int i = 0; i < num; i++) { //位置 p[i].position._Vector3f.x = Rand(4); p[i].position._Vector3f.y = 4.f; p[i].position._Vector3f.z = Rand(0.5) + 0.5; //颜色 p[i].color._Vector3f.x = 255; p[i].color._Vector3f.y = 0; p[i].color._Vector3f.z = 0; //初始速度 p[i].v._Vector3f.x = Rand(0.1) + 1; p[i].v._Vector3f.y = 0; p[i].v._Vector3f.z = Rand(0.01) -0.01; //加速度 p[i].g._Vector3f.x = Rand(0.01) - 0.01; p[i].g._Vector3f.y = Rand(0.05) - 0.05; p[i].g._Vector3f.z = Rand(0.01) - 0.01; //生命周期 p[i].lt.data[0] = Rand(20)+20; p[i].lt.data[1] = 0.5; } //Shader.vs代码 //如果开启粒子系统 if(Particle == 1) { //tt为实际粒子时间,tex.s为粒子的生命周期,time为从程序运行到现在经历的时间 float tt = time - (int(time / tex.s)) *tex.s; position = Position + v*tt + 0.5 * g * tt*tt; }