代码:

  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  }

 

 posted on 2012-04-13 17:09  xiacl  阅读(337)  评论(0编辑  收藏  举报