constchar*m_ClassName;/**<程序名*/
boolm_IsProgramLooping;/**<程序循环标记,如果为false,则退出程序*/
boolm_CreateFullScreen;/**<若为true,则创建全屏模式*/
boolm_IsVisible;/**<窗口是否可见*/
boolm_ResizeDraw;/**<是否在改变大小时,调用了绘制函数*/
DWORDm_LastTickCount;/**<上一次计时器的值*/
};
2、纹理贴图
(1)BMP位图文件的载入
BMP格式是windows采用的常见的图像文件存储格式。
定义位图类CBMPLoader,实现位图文件的载入。
/**位图载入类*/
classCBMPLoader
{
public:
CBMPLoader();
~CBMPLoader();
boolLoadBitmap(constchar*filename);/**<装载一个bmp文件*/
voidFreeImage();/**<释放图像数据*/
boolLoad(constchar*fileName);/**<载入位图并创建纹理*/
unsignedintID;/**<生成纹理的ID号*/
intimageWidth;/**<图像宽度*/
intimageHeight;/**<图像高度*/
unsignedchar*image;/**<指向图像数据的指针*/
};
(2)绘制场景并纹理贴图
绘制正方体和球体,并贴图。
/**绘制球体*/
voidSnowDemo:
:
DrawSphere()
{
glPushMatrix();
glTranslatef(3.0f,0.0f,-10.0f);
glRotatef(rot,1.0f,1.0f,1.0f);
/**指定纹理*/
glBindTexture(GL_TEXTURE_2D,texture2.ID);
GLUquadricObj*sphere=gluNewQuadric();
gluQuadricOrientation(sphere,GLU_OUTSIDE);
gluQuadricNormals(sphere,GLU_SMOOTH);
gluQuadricTexture(sphere,GL_TRUE);
gluSphere(sphere,2.5,50,50);
gluDeleteQuadric(sphere);
glPopMatrix();
}
/**绘制立方体*/
voidSnowDemo:
:
DrawBox()
{
/**设置材质属性*/
GLfloatmat_ambient[]={0.8f,0.8f,0.8f,1.0f};
GLfloatmat_diffuse[]={0.8f,0.8f,0.8f,1.0f};
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glPushMatrix();
glTranslatef(-5.0f,0.0f,-10.0f);
glRotatef(rot,1.0f,1.0f,0.0f);
/**绘制六个面*/
///前侧面
glBindTexture(GL_TEXTURE_2D,texture[0].ID);
glBegin(GL_QUADS);
glNormal3f(0.0f,0.0f,1.0f);/**<指定法线指向观察者*/
glTexCoord2f(0.0f,0.0f);glVertex3f(-2.0f,-2.0f,2.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(2.0f,-2.0f,2.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(2.0f,2.0f,2.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(-2.0f,2.0f,2.0f);
glEnd();
///后侧面
glBindTexture(GL_TEXTURE_2D,texture[1].ID);
glBegin(GL_QUADS);
glNormal3f(0.0f,0.0f,-1.0f);/**<指定法线背向观察者*/
glTexCoord2f(1.0f,0.0f);glVertex3f(-2.0f,-2.0f,-2.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(-2.0f,2.0f,-2.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(2.0f,2.0f,-2.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(2.0f,-2.0f,-2.0f);
glEnd();
///顶面
glBindTexture(GL_TEXTURE_2D,texture[2].ID);
glBegin(GL_QUADS);
glNormal3f(0.0f,1.0f,0.0f);/**<指定法线向上*/
glTexCoord2f(0.0f,1.0f);glVertex3f(-2.0f,2.0f,-2.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(-2.0f,2.0f,2.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(2.0f,2.0f,2.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(2.0f,2.0f,-2.0f);
glEnd();
///底面
glBindTexture(GL_TEXTURE_2D,texture[3].ID);
glBegin(GL_QUADS);
glNormal3f(0.0f,-1.0f,0.0f);/**<指定法线朝下*/
glTexCoord2f(1.0f,1.0f);glVertex3f(-2.0f,-2.0f,-2.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(2.0f,-2.0f,-2.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(2.0f,-2.0f,2.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(-2.0f,-2.0f,2.0f);
glEnd();
///右侧面
glBindTexture(GL_TEXTURE_2D,texture[4].ID);
glBegin(GL_QUADS);
glNormal3f(1.0f,0.0f,0.0f);/**<指定法线朝右*/
glTexCoord2f(1.0f,0.0f);glVertex3f(2.0f,-2.0f,-2.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(2.0f,2.0f,-2.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(2.0f,2.0f,2.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(2.0f,-2.0f,2.0f);
glEnd();
///左侧面
glBindTexture(GL_TEXTURE_2D,texture[5].ID);
glBegin(GL_QUADS);
glNormal3f(-1.0f,0.0f,0.0f);/**<指定法线朝左*/
glTexCoord2f(0.0f,0.0f);glVertex3f(-2.0f,-2.0f,-2.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(-2.0f,-2.0f,2.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(-2.0f,2.0f,2.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(-2.0f,2.0f,-2.0f);
glEnd();
glPopMatrix();
}
3、位图字体
(1)位图字体类
显示位图字体需要用到OpenGL显示列表和绘制位图字符的相关知识。
定义字体类GLFont.
/**定义字体类*/
classGLFont
{
public:
/**构造函数和析构函数*/
GLFont();
~GLFont();
///成员方法
boolInitFont();/**<初始化字体*/
voidPrintText(char*string,floatx,floaty);/**<在(x,y)处输出string内容*/
protected:
HFONTm_hFont;/**<字体句柄*/
};
4、粒子系统设计
(1)粒子的结构
粒子的结构定义了粒子的位置、速度、加速度、生命时间值、消失掉速度、尺寸以及颜色等信息。
在定义这个结构后我们就可以在具体程序中对这些值进行设置、更新等操作。
/**粒子结构*/
structParticle
{
Vector3position;/**<粒子的位置*/
Vector3velocity;/**<粒子的速度*/
Vector3acceleration;/**<粒子的加速度*/
floatlifetime;/**<粒子生命值*/
floatdec;/**<粒子消失的速度*/
floatsize;/**<粒子尺寸*/
floatcolor[3];/**<粒子的颜色*/
};
(2)粒子类
在粒子系统类中封装一些共有属性和操作,包括粒子的数目,初始化函数、更新函数等。
这样对于具体的粒子系统就可以从该类中继承,重载实现这些接口,就可以创造出不同的实际效果。
/**粒子类*/
classCParticle
{
public:
CParticle();/**<构造函数*/
virtual~CParticle();/**<析构函数*/
/**粒子的初始化*/
virtualboolInit(int_num);
/**粒子的渲染*/
virtualvoidRender()=0;
/**粒子的更新*/
virtualvoidUpdate()=0;
protected:
intm_iNum;/**<粒子总数目*/
Particle*m_pList;/**<粒子指针*/
};
(3)粒子系统模拟雪花
由粒子系统类CParticle派生雪花类。
/**雪花渲染类*/
classCSnow:
publicCParticle
{
public:
CSnow(){};
~CSnow(){};
boolInit(intnum);/**初始化过程*/
voidRender();/**<渲染过程*/
voidUpdate();/**<更新过程*/
private:
CBMPLoaderm_texture;/**<粒子的纹理*/
};
四、实验结果
本次实验主要绘制了一个雪花粒子场景,其中有正方体和球体,还有飞舞的变色文字。
通过按住空格键来实现正方体和球体的旋转,按F1键来实现半透明场景的展现。
(1)主程序
/**从GL_Application派生出一个子类*/
classSnowDemo:
GLApplication
{
public:
boolInit();/**<执行所有的初始化工作*/
voidUninit();/**<执行所有的卸载工作*/
voidUpdate(DWORDmilliseconds);/**<执行所有的更新操作*/
voidDraw();/**<执行所有的绘制操作*/
boolLoadTexture();/**<载入纹理*/
voidDrawSphere();/**<绘制球体*/
voidDrawBox();/**<绘制正方体*/
private:
friendclassGLApplication;/**<父类为它的一个友元类*/
SnowDemo(constchar*class_name);/**<构造函数*/
/**用户自定义的程序变量*/
CSnowm_Snow;/