电子与信息工程学院计算机科学与技术系第16讲真实感绘制编程实例实例一光照实例二加载3D世界电子与信息工程学院计算机科学与技术系实例一光照编程实例加入光照电子与信息工程学院计算机科学与技术系光照编程实例使用键盘移动场景中的对象电子与信息工程学院计算机科学与技术系光照编程实例#includewindows.h//Windows的头文件#includestdio.h//标准输入/输出的头文件#includegl\gl.h//OpenGL32库的头文件#includegl\glu.h//GLu32库的头文件#includegl\glaux.h//GLaux库的头文件HDChDC=NULL;//私有GDI设备描述表HGLRChRC=NULL;//永久着色描述表HWNDhWnd=NULL;//保存我们的窗口句柄HINSTANCEhInstance;//保存程序的实例boolkeys[256];//用于键盘例程的数组boolactive=TRUE;//窗口的活动标志,缺省为TRUEboolfullscreen=TRUE;//全屏标志缺省设定成全屏模式电子与信息工程学院计算机科学与技术系BOOLlight;//光源的开/关BOOLlp;//L键按下了么?light变量跟踪光照是否打开变量lp存储'L'键是否按下的状态电子与信息工程学院计算机科学与技术系GLfloatxrot;//X旋转GLfloatyrot;//Y旋转GLfloatxspeed;//X旋转速度GLfloatyspeed;//Y旋转速度GLfloatz=-5.0f;//深入屏幕的距离设置变量来控制绕x轴和y轴旋转角度的步长,以及绕x轴和y轴的旋转速度。创建一个z变量来控制进入屏幕深处的距离电子与信息工程学院计算机科学与技术系GLfloatLightAmbient[]={0.2f,0.2f,0.2f,1.0f};设置环境光电子与信息工程学院计算机科学与技术系GLfloatLightDiffuse[]={1.0f,1.0f,1.0f,1.0f};设置漫射光参数漫射光由特定的光源产生,处于漫射光直接照射下的任何对象表面都变得很亮,而几乎未被照射到的区域就显得要暗一些。这样在所创建的木板箱的棱边上就会产生的很不错的阴影效果。生成最亮的漫射光。所有的参数值都取成最大值1.0f。它将照在木板箱的前面。电子与信息工程学院计算机科学与技术系GLfloatLightPosition[]={0.0f,0.0f,1.0f,1.0f};设置光源位置,直接照射在木箱的正面前三个参数分别是XYZ轴上的位移。电子与信息工程学院计算机科学与技术系AUX_RGBImageRec*LoadBMP(char*Filename)//载入位图{……………..}电子与信息工程学院计算机科学与技术系//载入位图并转换成纹理intLoadGLTextures(){……………..}电子与信息工程学院计算机科学与技术系intInitGL(GLvoid)//此处开始对OpenGL进行所有设置{if(!LoadGLTextures())//跳转到纹理载入例程{returnFALSE;//如果不能载入纹理返回FALSE}glEnable(GL_TEXTURE_2D);//启用纹理映射glShadeModel(GL_SMOOTH);//启用阴影平滑glClearColor(0.0f,0.0f,0.0f,0.5f);//黑色背景glClearDepth(1.0f);//深度缓存设置glEnable(GL_DEPTH_TEST);//启用深度测试glDepthFunc(GL_LEQUAL);//所作的深度测试类型glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//高度优化的透视投影计算电子与信息工程学院计算机科学与技术系glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient);设置环境光的发光量glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse);设置漫射光的发光量glLightfv(GL_LIGHT1,GL_POSITION,LightPosition);设置光源的位置电子与信息工程学院计算机科学与技术系glEnable(GL_LIGHT1);//启用一号光源returnTRUE;//初始化OK}注意启动光照系统glEnable(GL_LIGHTING);在控制代码中,所以现在还没有启动光照电子与信息工程学院计算机科学与技术系绘制立方体intDrawGLScene(GLvoid){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0.0f,0.0f,z);//移入/移出屏幕z个单位glRotatef(xrot,1.0f,0.0f,0.0f);//绕X轴旋转glRotatef(yrot,0.0f,1.0f,0.0f););//绕Y轴旋转glBindTexture(GL_TEXTURE_2D,texture[0]);glBegin(GL_QUADS);//开始绘制四边形电子与信息工程学院计算机科学与技术系glNormal3f(x,y,z);glNormal函数设定当前顶点法向法线是指经过面(多边形)上的一点且垂直于这个面(多边形)的直线使用光源的时候必须指定一条法线法线应该指向多边形的外侧电子与信息工程学院计算机科学与技术系Y(1,1,1)(1,1,-1)(-1,1,-1)(-1,1,1)(1,-1,-1)(-1,-1,-1)(1,-1,1)(-1,-1,1)前面电子与信息工程学院计算机科学与技术系//前侧面glNormal3f(0.0f,0.0f,1.0f);//法线指向观察者glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);电子与信息工程学院计算机科学与技术系Y(1,1,1)(1,1,-1)(-1,1,-1)(-1,1,1)(1,-1,-1)(-1,-1,-1)(1,-1,1)(-1,-1,1)后面电子与信息工程学院计算机科学与技术系//后侧面glNormal3f(0.0f,0.0f,-1.0f);//法线背向观察者glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);电子与信息工程学院计算机科学与技术系Y(1,1,1)(1,1,-1)(-1,1,-1)(-1,1,1)(1,-1,-1)(-1,-1,-1)(1,-1,1)(-1,-1,1)顶面电子与信息工程学院计算机科学与技术系//顶面glNormal3f(0.0f,1.0f,0.0f);//法线向上glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,1.0f,1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,1.0f,1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);电子与信息工程学院计算机科学与技术系Y(1,1,1)(1,1,-1)(-1,1,-1)(-1,1,1)(1,-1,-1)(-1,-1,-1)(1,-1,1)(-1,-1,1)底面电子与信息工程学院计算机科学与技术系//底面glNormal3f(0.0f,-1.0f,0.0f);//法线朝下glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);电子与信息工程学院计算机科学与技术系Y(1,1,1)(1,1,-1)(-1,1,-1)(-1,1,1)(1,-1,-1)(-1,-1,-1)(1,-1,1)(-1,-1,1)右侧面电子与信息工程学院计算机科学与技术系//右侧面glNormal3f(1.0f,0.0f,0.0f);//法线朝右glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);电子与信息工程学院计算机科学与技术系Y(1,1,1)(1,1,-1)(-1,1,-1)(-1,1,1)(1,-1,-1)(-1,-1,-1)(1,-1,1)(-1,-1,1)左侧面电子与信息工程学院计算机科学与技术系//左侧面glNormal3f(-1.0f,0.0f,0.0f);//法线朝左glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glEnd();//四边形绘制结束电子与信息工程学院计算机科学与技术系xrot+=xspeed;//xrot增加xspeed单位yrot+=yspeed;//yrot增加yspeed单位returnTRUE;}将xot和yrot的旋转值分别增加xspeed和yspeed个单位。xspeed和yspeed的值越大,立方体转得就越快。电子与信息工程学院计算机科学与技术系现在转入WinMain()主函数。在这里增加开关光源、旋转木箱和将木箱移近移远的控制代码。intWINAPIWinMain(){……………………….SwapBuffers(hDC);//交换缓存(双缓存)if(keys['L']&&!lp)//L键已按下并且松开了?{lp=TRUE;//lp设为TRUElight=!light;//切换光源的TRUE/FALSEif(!light)//如果没有光源{glDisable(GL_LIGHTING);//禁用光源}else//Otherwise{glEnable(GL_LIGHTING);//启用光源}}if(!keys['L'])//L键松开了么?{lp=FALSE;//若是,则