Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

使用OpenGL ES实现粒子效果

From Wiki
Jump to: navigation, search
Article Metadata

代码示例
文章
zengcity 在 20 Jan 2010 创建
最后由 hamishwillee 在 15 Dec 2011 编辑


实现代码

主要参考NeHe的OpenGL的粒子效果实现.

关键代码:

数据定义:

#define	MAX_PARTICLES	100				// 定义最大的粒子数
bool rainbow = true; // 是否为彩虹模式
bool sp; // 空格键是否被按下
bool rp; // 回车键是否被按下
float slowdown = 2.0f; // 减速粒子
float xspeed; // X方向的速度
float yspeed; // Y方向的速度
float zoom = -40.0f; // 沿Z轴缩放
GLuint loop; // 循环变量
GLuint col; // 当前的颜色
GLuint delay; // 彩虹效果延迟
typedef struct // 创建粒子数据结构
{
bool active; // 是否激活
float life; // 粒子生命
float fade; // 衰减速度
float r; // 红色值
float g; // 绿色值
float b; // 蓝色值
float x; // X 位置
float y; // Y 位置
float z; // Z 位置
float xi; // X 方向
float yi; // Y 方向
float zi; // Z 方向
 
float xg; // X 方向重力加速度
float yg; // Y 方向重力加速度
float zg; // Z 方向重力加速度
} particles; // 粒子数据结构
particles particle[MAX_PARTICLES]; // 保存1000个粒子的数组

数据初始化:

for (loop = 0; loop < MAX_PARTICLES; loop++) //初始化所有的粒子
{
particle[loop].active = true; // 使所有的粒子为激活状态
particle[loop].life = 1.0f; // 所有的粒子生命值为最大
particle[loop].fade = float(Math::Random() % 100) / 1000.0f + 0.003f; // 随机生成衰减速率
particle[loop].r = colors[loop * (12 / MAX_PARTICLES)][0]; // 粒子的红色颜色
particle[loop].g = colors[loop * (12 / MAX_PARTICLES)][1]; // 粒子的绿色颜色
particle[loop].b = colors[loop * (12 / MAX_PARTICLES)][2]; // 粒子的蓝色颜色
particle[loop].xi = float((Math::Random() % 50) - 25.0f) * 10.0f; // 随机生成X轴方向速度
particle[loop].yi = float((Math::Random() % 50) - 25.0f) * 10.0f; // 随机生成Y轴方向速度
particle[loop].zi = float((Math::Random() % 50) - 25.0f) * 10.0f; // 随机生成Z轴方向速度
particle[loop].xg = float(Math::Random() % 50) / 1000.0f; // 设置X轴方向加速度为0
particle[loop].yg = float(Math::Random() % 50) / 1000.0f; // 设置Y轴方向加速度为-0.8
particle[loop].zg = float(Math::Random() % 50) / 1000.0f; // 设置Z轴方向加速度为0
}

绘制:

void CParticles::DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
 
glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存
// glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_CURRENT_BIT
// | GL_LIGHTING_BIT | GL_TRANSFORM_BIT | GL_TEXTURE_BIT);
 
glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
 
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
 
glEnable(GL_TEXTURE_2D);
 
//以上代码使黑色透明
 
//glLoadIdentity(); // 重置当前的模型观察矩阵
/***********************************新添的代码***********************************************************************************/
for (loop = 0; loop < MAX_PARTICLES; loop++) // 循环所有的粒子
{
if (particle[loop].active) // 如果粒子为激活的
{
float x = particle[loop].x; // 返回X轴的位置
float y = particle[loop].y; // 返回Y轴的位置
float z = particle[loop].z + zoom; // 返回Z轴的位置
// 设置粒子颜色
 
glPushMatrix();
 
glColor4f(particle[loop].r, particle[loop].g, particle[loop].b,
particle[loop].life);
 
glTranslatef(x, y, z);
glBindTexture(GL_TEXTURE_2D, iOpenGLES.iID);
glDrawElements(GL_TRIANGLES, 2 * 3, GL_UNSIGNED_BYTE, triangles);
 
glPopMatrix();
 
// glBegin(GL_TRIANGLE_STRIP); // 绘制三角形带
// glTexCoord2d(1,1); glVertex3f(x+0.5f,y+0.5f,z);
// glTexCoord2d(0,1); glVertex3f(x-0.5f,y+0.5f,z);
// glTexCoord2d(1,0); glVertex3f(x+0.5f,y-0.5f,z);
// glTexCoord2d(0,0); glVertex3f(x-0.5f,y-0.5f,z);
// glEnd();
 
particle[loop].x += particle[loop].xi / (slowdown * 1000); // 更新X坐标的位置
particle[loop].y += particle[loop].yi / (slowdown * 1000); // 更新Y坐标的位置
particle[loop].z += particle[loop].zi / (slowdown * 1000); // 更新Z坐标的位置
particle[loop].xi += particle[loop].xg; // 更新X轴方向速度大小
particle[loop].yi += particle[loop].yg; // 更新Y轴方向速度大小
particle[loop].zi += particle[loop].zg; // 更新Z轴方向速度大小
particle[loop].life -= particle[loop].fade; // 减少粒子的生命值
if (particle[loop].life < 0.0f) // 如果粒子生命值小于0
{
particle[loop].life = 1.0f; // 产生一个新的粒子
particle[loop].fade = float(Math::Random() % 100) / 1000.0f
+ 0.003f; // 随机生成衰减速率
particle[loop].x = 0.0f; // 新粒子出现在屏幕的中央
particle[loop].y = 0.0f;
particle[loop].z = 0.0f;
 
// particle[loop].xi = xspeed + float((Math::Random() % 60)
// - 32.0f); // 随机生成粒子速度
// particle[loop].yi = yspeed + float((Math::Random() % 60)
// - 30.0f);
// particle[loop].zi = float((Math::Random() % 60) - 30.0f);
 
particle[loop].xi=float((Math::Random()%50)-25.0f)*10.0f; // 随机生成X轴方向速度
particle[loop].yi=float((Math::Random()%50)-25.0f)*10.0f; // 随机生成Y轴方向速度
particle[loop].zi=float((Math::Random()%50)-25.0f)*10.0f; // 随机生成Z轴方向速度
particle[loop].xg=float(Math::Random()%50)/1000.0f; // 设置X轴方向加速度为0
particle[loop].yg=float(Math::Random()%50)/1000.0f; // 设置Y轴方向加速度为-0.8
particle[loop].zg=float(Math::Random()%50)/1000.0f; // 设置Z轴方向加速度为0
 
 
particle[loop].r = colors[col][0]; // 设置粒子颜色
particle[loop].g = colors[col][1];
particle[loop].b = colors[col][2];
}
}
}
}

效果预览

Partical.JPG



工程下载

File:OpenGLParticles.zip

This page was last modified on 15 December 2011, at 05:00.
175 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×