1、wp.h#include / Windows的头文件#include / 包含OpenGL实用库#include / 标准输入/输出库的头文件#include / GLaux库的头文件#include#include #include #include /.定义变量区./.用于场景漫游有关变量./GLfloat xrot=0.0f;/ X 旋转量GLfloat yrot=0.0f;/ Y 旋转量GLfloat x=0.0f; / X 平移量GLfloat y=0.0f; / Y 平移量GLfloat z=-40.0f; / 深入屏幕的距离/.用于键盘操作有关变量./BOOL light=TRU
2、E; / 光源的开/关BOOL lp; / L键按下了么?BOOL fp; / F键按下了么?BOOL TurnOn=FALSE; / 开灯GLUquadricObj *qobj; int fantheta=0; / 风扇转过角度HGLRC hRC=NULL; / 窗口着色描述表句柄HDC hDC=NULL; / OpenGL渲染描述表句柄HWND hWnd=NULL; / 保存我们的窗口句柄HINSTANCE hInstance; / 保存程序的实例bool keys256; / 保存键盘按键的数组bool active=TRUE; / 窗口的活动标志,缺省为TRUEbool fullscr
3、een=TRUE; / 全屏标志缺省,缺省设定成全屏模式/.光照材质有关变量./GLfloat light_Ambient= 0.1f, 0.1f, 0.1f, 1.0f ; / 环境光参数GLfloat light_Diffuse= 1.0f, 1.0f, 0.45f, 1.0f ;/ 漫射光参数GLfloat light_position=0.0,29.9,0.0,1.0; / 光源位置GLfloat light_position1=20.0,29.9,0.0,1.0;GLfloat mat_ambient=0.05f,0.05f,0.05f,1.0f; / 材质环境光参数GLfloat
4、mat_specular=0.8,1.0,1.0,1.0; / 材质镜面光参数GLfloat mat_shininess=5.0; GLfloat white_light=1.0,1.0,1.0,1.0; / 光GLfloat no_mat= 0.0f, 0.0f, 0.0f, 1.0f; / 无材质色GLfloat no_shininess= 0.0f; / 无反光GLfloat mat_diffuse= 1.0f, 1.0f, 1.0f, 1.0f; / 漫反射GLfloat diffusion=0.521f,0.121f,0.0547f,1.0;/.纹理./GLuint texture6
5、; / 7种纹理的储存空间/.时钟有关变量./GLfloat cx=35.0,cy=15.0,cz=-79.9,radius=5.0;GLfloat hradius=2.0,mradius=3.0,sradius=4.0;GLfloat sangle,mangle,hangle;GLuint second,miniter,hour;char timebuffer9;LRESULTCALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); / WndProc的定义wp.cpp#includewp.h/.创建纹理./AUX_RGBImageRec *LoadBMP(
6、char *Filename) / 载入位图图象FILE *File=NULL; / 文件句柄if (!Filename) / 确保文件名已提供 return NULL; / 如果没提供,返回 NULLFile=fopen(Filename,r); / 尝试打开文件if (File) / 文件存在么? fclose(File); / 关闭句柄 return auxDIBImageLoad(Filename); / 载入位图并返回指针return NULL; / 如果载入失败,返回 NULLint LoadGLTextures() / 载入位图并转换成纹理int Status=FALSE; /
7、状态指示器AUX_RGBImageRec *TextureImage6; / 创建纹理的存储空间memset(TextureImage,0,sizeof(void *)*1); / 将指针设为 NULL / 载入位图,检查有无错误,如果位图没找到则退出Status=TRUE; / 将 Status 设为 TRUE /.创建第一个纹理,地板./ if (TextureImage0=LoadBMP(floor.bmp) glGenTextures(1, &texture0);/ 创建纹理 glBindTexture(GL_TEXTURE_2D, texture0); glTexParameteri
8、(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage0-sizeX, TextureImage0-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage0-data);/绑定纹理 if (TextureImage0)
9、/纹理是否存在if (TextureImage0-data)/纹理图像是否存在free(TextureImage0-data);/释放纹理图像占用的内存free(TextureImage0);/释放图像结构 /.创建第二个纹理,墙./ if (TextureImage1=LoadBMP(wall.bmp) glGenTextures(1, &texture1); /创建纹理 glBindTexture(GL_TEXTURE_2D, texture1); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤
10、波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage1-sizeX, TextureImage1-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage1-data);/绑定纹理 if (TextureImage1)/纹理是否存在 if (TextureImage1-data)/纹理图像是否存在 free(TextureIma
11、ge1-data);/释放纹理图像占用的内存 free(TextureImage1);/释放图像结构 /.创建第三个纹理,窗户./ if (TextureImage2=LoadBMP(glass.bmp) glGenTextures(1, &texture2);/创建纹理 glBindTexture(GL_TEXTURE_2D, texture2);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
12、GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage2-sizeX, TextureImage2-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage2-data);/绑定纹理 if (TextureImage2)/纹理是否存在if (TextureImage2-data)/纹理图像是否存在free(TextureImage2-data);/释放纹理图像占用的内存free(TextureImage2);/释放图像结构 /.创建第四
13、个纹理,门./if (TextureImage3=LoadBMP(door.bmp) glGenTextures(1, &texture3);/创建纹理glBindTexture(GL_TEXTURE_2D, texture3);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(
14、GL_TEXTURE_2D, 3, TextureImage3-sizeX, TextureImage3-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage3-data);/绑定纹理 if (TextureImage3)/纹理是否存在if (TextureImage3-data)/纹理图像是否存在free(TextureImage3-data);/释放纹理图像占用的内存free(TextureImage3);/释放图像结构 /.创建第五个纹理,灯./if (TextureImage4=LoadBMP(lamp.bmp)Status=TRUE; glGen
15、Textures(1, &texture4);/创建纹理glBindTexture(GL_TEXTURE_2D, texture4);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage4-sizeX, TextureIm
16、age4-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage4-data);/绑定纹理 if (TextureImage4)/纹理是否存在if (TextureImage4-data)/纹理图像是否存在free(TextureImage4-data);/释放纹理图像占用的内存free(TextureImage4);/释放图像结构 /.创建第六个纹理,黑板./if (TextureImage5=LoadBMP(blackwall.bmp) glGenTextures(1, &texture5);/创建纹理glBindTexture(GL_TEXTURE_2
17、D, texture5);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);/远处采用线性滤波glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);/近处采用MipMapped滤波 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage5-sizeX, TextureImage5-sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage5-da
18、ta);/绑定纹理 if (TextureImage5)/纹理是否存在if (TextureImage5-data)/纹理图像是否存在free(TextureImage5-data);/释放纹理图像占用的内存free(TextureImage5);/释放图像结构 return Status;/.重置OpenGL窗口大小./GLvoid ReSizeGLScene(GLsizei width, GLsizei height)/ 重置OpenGL窗口大小if (height=0) / 防止被零除height=1; / 将Height设为1glViewport(0, 0, width, height); / 重置当前的视口 glMatrixMode(GL_PROJECTION); / 选择投影矩阵glLoadIdentity(); / 重置投影矩阵 / 设置视口的大小 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,1000.0f);glMatrixMode(GL_MODELVIEW); / 选择模型观察矩阵glLoadIdentity(); / 重置模型观察矩阵 /.