代码:
1 #define GLUT_DISABLE_ATEXIT_HACK 2 #include "gl/glut.h" 3 4 void OnDisplay(void); 5 void OnReShape(int,int); 6 void OnKey(GLubyte,GLint,GLint); 7 void SetupRC(); 8 void SetupLights(); 9 10 void main(int argc,char* argv[]) 11 { 12 glutInit(&argc,argv); 13 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 14 glutInitWindowSize(600,480); 15 glutCreateWindow("OpenGL光源"); 16 17 glutReshapeFunc(OnReShape); 18 glutDisplayFunc(OnDisplay); 19 glutKeyboardFunc(OnKey); 20 21 SetupRC(); 22 SetupLights(); 23 24 glutMainLoop(); 25 } 26 27 //显示 回调函数 28 void OnDisplay(void) 29 { 30 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 31 32 glMatrixMode(GL_MODELVIEW); 33 glLoadIdentity(); 34 35 glColor3f(0.7f,0.7f,0.7f); 36 glutSolidSphere(50.0f,50.0f,50.0f); //绘制一个浅灰色的球体 37 38 glutSwapBuffers(); 39 40 } 41 //窗口尺寸变化后的回调函数 42 void OnReShape(int w,int h) 43 { 44 glViewport(0,0,w,h); 45 46 glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式 47 glLoadIdentity(); 48 49 GLfloat aspect =(float)w/(float)h; 50 51 if(w<=h) 52 { 53 glOrtho(-100.0f,100.0f,-100.0f/aspect,100.0f/aspect,-100.0f,100.0f); 54 } 55 else 56 { 57 glOrtho(-100.0f*aspect,100.0f*aspect,-100.0f,100.0f,-100.0f,100.0f); 58 } 59 } 60 61 62 //按键处理回调函数 63 void OnKey(GLubyte key,GLint x,GLint y) 64 { 65 switch(key){ 66 67 case 0x31: //打开红色射灯 68 glDisable(GL_LIGHT2); 69 glDisable(GL_LIGHT3); 70 glEnable(GL_LIGHT1); 71 break; 72 73 case 0x32: //打开绿色射灯 74 glDisable(GL_LIGHT1); 75 glDisable(GL_LIGHT3); 76 glEnable(GL_LIGHT2); 77 break; 78 79 case 0x33: //打开蓝色射灯 80 glDisable(GL_LIGHT2); 81 glDisable(GL_LIGHT1); 82 glEnable(GL_LIGHT3); 83 break; 84 85 case 0x34: //打开红色主光源 86 glDisable(GL_LIGHT0); 87 glEnable(GL_LIGHT4); 88 break; 89 90 default: //关闭所有射灯并将主光源换成白色 91 glDisable(GL_LIGHT1); 92 glDisable(GL_LIGHT2); 93 glDisable(GL_LIGHT3); 94 glDisable(GL_LIGHT4); 95 glEnable(GL_LIGHT0); 96 break; 97 98 } 99 glutPostRedisplay(); 100 } 101 102 //设置渲染环境 103 void SetupRC() 104 { 105 glClearColor(0.0f,0.0f,0.0f,1.0f); 106 107 glEnable(GL_DEPTH_TEST); 108 glShadeModel(GL_SMOOTH); 109 } 110 111 //设置光照 112 void SetupLights() 113 { 114 GLfloat ambientLight[]={0.2f,0.2f,0.2f,1.0f};//白色主光源环境光 115 GLfloat diffuseLight[]={0.8f,0.8f,0.8f,1.0f};//白色主光源漫反射 116 GLfloat specularLight[]={1.0f,1.0f,1.0f,1.0f};//白色主光源镜面光 117 118 GLfloat redAmbiLight[]={0.2f,0.0f,0.0f,1.0f};//红色主光源环境光 119 GLfloat redDiffLight[]={0.8f,0.0f,0.0f,1.0f};//红色主光源漫反射 120 GLfloat redSpecLight[]={1.0f,0.0f,0.0f,1.0f};//红色主光源镜面光 121 122 GLfloat lightPos[]={50.0f,120.0f,120.0f,1.0f}; //光源位置 123 GLfloat spotLightPos[]={0.0f,0.0f,200.0f,1.0f}; //射灯位置 124 GLfloat spotDir[]={0.0f,0.0f,-1.0f}; //射灯方向 125 126 GLfloat redLight[]={1.0f,0.0f,0.0f,1.0f}; //红色光源 127 GLfloat greenLight[]={0.0f,1.0f,0.0f,1.0f}; //绿色光源 128 GLfloat blueLight[]={0.0f,0.0f,1.0f,1.0f}; //蓝色光源 129 130 131 glEnable(GL_LIGHTING); //启用光照 132 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); //设置环境光源 133 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); //设置漫反射光源 134 glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight); //设置镜面光源 135 glLightfv(GL_LIGHT0,GL_POSITION,lightPos); //设置灯光位置 136 glEnable(GL_LIGHT0); //打开白色主光源 137 138 glLightfv(GL_LIGHT4,GL_AMBIENT,redAmbiLight); 139 glLightfv(GL_LIGHT4,GL_DIFFUSE,redDiffLight); 140 glLightfv(GL_LIGHT4,GL_SPECULAR,redSpecLight); 141 glLightfv(GL_LIGHT4,GL_POSITION,lightPos); 142 143 glLightfv(GL_LIGHT1,GL_SPECULAR,redLight); //红色射灯 144 glLightfv(GL_LIGHT1,GL_POSITION,spotLightPos); 145 glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spotDir); 146 glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,85.0f); 147 148 glLightfv(GL_LIGHT2,GL_SPECULAR,greenLight); //绿色射灯 149 glLightfv(GL_LIGHT2,GL_POSITION,spotLightPos); 150 glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION,spotDir); 151 glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,85.0f); 152 153 glLightfv(GL_LIGHT3,GL_SPECULAR,blueLight); //蓝色射灯 154 glLightfv(GL_LIGHT3,GL_POSITION,spotLightPos); 155 glLightfv(GL_LIGHT3,GL_SPOT_DIRECTION,spotDir); 156 glLightf(GL_LIGHT3,GL_SPOT_CUTOFF,85.0f); 157 158 159 glEnable(GL_COLOR_MATERIAL); //启用材质的颜色跟踪 160 glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); //指定材料着色的面 161 glMaterialfv(GL_FRONT,GL_SPECULAR,specularLight); //指定材料对镜面光的反应 162 glMateriali(GL_FRONT,GL_SHININESS,100); //指定反射系数 163 164 165 }