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,,;
glRotatef(rot,,,;
/**指定纹理*/
glBindTexture(GL_TEXTURE_2D,;
GLUquadricObj*sphere=gluNewQuadric();
gluQuadricOrientation(sphere,GLU_OUTSIDE);
gluQuadricNormals(sphere,GLU_SMOOTH);
gluQuadricTexture(sphere,GL_TRUE);
gluSphere(sphere,,50,50);
gluDeleteQuadric(sphere);
glPopMatrix();
}
/**绘制立方体*/
voidSnowDemo:
:
DrawBox()
{
/**设置材质属性*/
GLfloatmat_ambient[]={,,,};
GLfloatmat_diffuse[]={,,,};
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glPushMatrix();
glTranslatef,,;
glRotatef(rot,,,;
/**绘制六个面*/
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线指向观察者*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线背向观察者*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线向上*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线朝下*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线朝右*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线朝左*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
glPopMatrix();
}
3、位图字体
(1)位图字体类
显示位图字体需要用到OpenGL显示列表和绘制位图字符的相关知识。
定义字体类GLFont.
/**定义字体类*/
classGLFont
{
public:
/**构造函数和析构函数*/
GLFont();
~GLFont();
oad("")||!
texture[1].Load("")||!
texture[2].Load("")||!
texture[3].Load("")||!
texture[4].Load("")||!
texture[5].Load(""))/**<载入位图文件*/
{
MessageBox(NULL,"装载位图文件失败!
","错误",MB_OK);/**<如果载入失败则弹出对话框*/
returnfalse;
}
if(!
(""))
{
MessageBox(NULL,"装载位图文件失败!
","错误",MB_OK);
}
/**启用纹理映射*/
glEnable(GL_TEXTURE_2D);
returntrue;
}
/**初始化OpenGL*/
boolSnowDemo:
:
Init()
{
/**用户自定义的初始化过程*/
glClearColor,,,;
glClearDepth;
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
ResizeDraw(true);
/**载入纹理*/
if(!
LoadTexture())
MessageBox(NULL,"载入纹理失败!
","错误",MB_OK);
/**初始化字体*/
if(!
())
MessageBox(NULL,"初始化字体失败!
","错误",MB_OK);
/**初始化雪花实例*/
if(!
(400))
{
MessageBox(NULL,"雪花系统初始化失败!
","错误",MB_OK);
exit(-1);
}
returntrue;
}
/**用户自定义的卸载函数*/
voidSnowDemo:
:
Uninit()
{
}
/**程序更新函数*/
voidSnowDemo:
:
Update(DWORDmilliseconds)
{
if(VK_ESCAPE)==true)/**<按ESC退出*/
{
TerminateApplication();
}
if(VK_SPACE)==true)/**<按空格键开始旋转*/
{
rot+=milliseconds/;
}
cnt1+=milliseconds/;/**<更新计数器值*/
cnt2+=milliseconds/;/**<更新计数器值*/
}
/**绘制球体*/
voidSnowDemo:
:
DrawSphere()
{
glPushMatrix();
glTranslatef,,;
glRotatef(rot,,,;
/**指定纹理*/
glBindTexture(GL_TEXTURE_2D,;
GLUquadricObj*sphere=gluNewQuadric();
gluQuadricOrientation(sphere,GLU_OUTSIDE);
gluQuadricNormals(sphere,GLU_SMOOTH);
gluQuadricTexture(sphere,GL_TRUE);
gluSphere(sphere,,50,50);
gluDeleteQuadric(sphere);
glPopMatrix();
}
/**绘制立方体*/
voidSnowDemo:
:
DrawBox()
{
/**设置材质属性*/
GLfloatmat_ambient[]={,,,};
GLfloatmat_diffuse[]={,,,};
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glPushMatrix();
glTranslatef,,;
glRotatef(rot,,,;
/**绘制六个面*/
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线指向观察者*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线背向观察者*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线向上*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glEnd();
D);
glBegin(GL_QUADS);
glNormal3f,,;/**<指定法线朝下*/
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;glVertex3f,,;
glTexCoord2f,;gl