光照

来源:互联网 发布:断网软件下载 编辑:程序博客网 时间:2024/06/11 06:53

1.创建、定位和启用光源
(1)定义光源的颜色和位置
GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };

(2)创建光源
 glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);  // Setup The Ambient Light设置环境光
 glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);  // Setup The Diffuse Light设置漫射光
 glLightfv(GL_LIGHT1, GL_POSITION,position);  // Position The Light设置光源位置

(3)启动光照和光源
 glEnable(GL_LIGHTING);     // 启动光照
 glEnable(GL_LIGHT1);     // Enable Light One启用一号光源

 

2.选择光照模型
GLfloat my_ambient[] = { 0.4, 0.4, 0.4, 1.0 };
GLfloat my_view[] = { 0.0 };
 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, my_ambient);
 glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, my_view);

 glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
 

3.定义材质
(1)材料属性
GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };
GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 };
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat no_shininess[] = { 0.0 };
GLfloat low_shininess[] = { 5.0 };
GLfloat high_shininess[] = { 100.0 };
GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};

(2)指定材料属性
glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
 

4.绘制物体
glutSolidSphere(1.0, 16, 16);



code:


[cpp] view plain copy
  1. #include <gl/glut.h>  
  2.   
  3. #define WIDTH 400  
  4. #define HEIGHT 400  
  5.   
  6. static GLfloat angle = 0.0f;  
  7.   
  8. void myDisplay(void)  
  9. {  
  10.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清空颜色和深度缓冲  
  11.   
  12.     // 创建透视效果视图  
  13.     glMatrixMode(GL_PROJECTION);//对投影矩阵操作  
  14.     glLoadIdentity();//将坐标原点移到中心  
  15.     gluPerspective(90.0f, 1.0f, 1.0f, 20.0f);//设置透视投影矩阵  
  16.     glMatrixMode(GL_MODELVIEW);//对模型视景矩阵操作  
  17.     glLoadIdentity();  
  18.     gluLookAt(0.0, 5.0, -10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//视点转换  
  19.   
  20.     // 定义太阳光源,它是一种白色的光源  
  21.     {  
  22.         GLfloat sun_position[] = {0.0f, 0.0f, 0.0f, 1.0f};  
  23.         GLfloat sun__ambient[]  = {0.0f, 0.0f, 0.0f, 1.0f};  
  24.         GLfloat sun_diffuse[]  = {1.0f, 1.0f, 1.0f, 1.0f};  
  25.         GLfloat sun_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};  
  26.   
  27.       glLightfv(GL_LIGHT0, GL_POSITION, sun_position); //指定第0号光源的位置   
  28.       glLightfv(GL_LIGHT0, GL_AMBIENT,  sun_ambient); //GL_AMBIENT表示各种光线照射材质上,
  29.                                                               //经过很多次反射后最终遗留在环境中的光线强度(颜色)  
  30.       glLightfv(GL_LIGHT0, GL_DIFFUSE,  sun_diffuse); //漫反射后~~  
  31.       glLightfv(GL_LIGHT0, GL_SPECULAR, sun_specular);//镜面反射后~~~  

  32.       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, sun_ambient);  //光照模型

  33.         glEnable(GL_LIGHT0); //使用第0号光照  
  34.         glEnable(GL_LIGHTING); //在后面的渲染中使用光照  
  35.         glEnable(GL_DEPTH_TEST); //这句是启用深度测试,这样,在后面的物体会被挡着,例如房子后面有棵树,如果不启用深度测试,  
  36.                          //你先画了房子再画树,树会覆盖房子的;但启用深度测试后无论你怎么画,树一定在房子后面(被房子挡着)   
  37.     }  
  38.   
  39.     // 定义太阳的材质并绘制太阳  
  40.     {  
  41.         GLfloat sun_mat_ambient[]  = {0.0f, 0.0f, 0.0f, 1.0f};  
  42.         GLfloat sun_mat_diffuse[]  = {0.0f, 0.0f, 0.0f, 1.0f};  
  43.         GLfloat sun_mat_specular[] = {0.0f, 0.0f, 0.0f, 1.0f};  
  44.         GLfloat sun_mat_emission[] = {0.5f, 0.0f, 0.0f, 1.0f};  
  45.         GLfloat sun_mat_shininess  = 0.0f;  
  46.   
  47.         glMaterialfv(GL_FRONT, GL_AMBIENT,   sun_mat_ambient); //定义材料的前面采用 "多次反射"  
  48.         glMaterialfv(GL_FRONT, GL_DIFFUSE,   sun_mat_diffuse); //材料的前面为 漫反射  
  49.         glMaterialfv(GL_FRONT, GL_SPECULAR,  sun_mat_specular); //定义材料的前面为 镜面反射  
  50.         glMaterialfv(GL_FRONT, GL_EMISSION,  sun_mat_emission); //定义材料的前面为 镜面指数  
  51.         glMaterialf (GL_FRONT, GL_SHININESS, sun_mat_shininess); //材料的前面 采用 的颜色  
  52.   
  53.         glutSolidSphere(2.0, 40, 32);  
  54.     }  
  55.   
  56.     // 定义地球的材质并绘制地球  
  57.     {  
  58.         GLfloat earth_mat_ambient[]  = {0.0f, 0.0f, 0.5f, 1.0f};  
  59.         GLfloat earth_mat_diffuse[]  = {0.0f, 0.0f, 0.5f, 1.0f};  
  60.         GLfloat earth_mat_specular[] = {0.0f, 0.0f, 1.0f, 1.0f};  
  61.         GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f};  
  62.         GLfloat earth_mat_shininess  = 30.0f;  
  63.   
  64.         glMaterialfv(GL_FRONT, GL_AMBIENT,   earth_mat_ambient);  
  65.         glMaterialfv(GL_FRONT, GL_DIFFUSE,   earth_mat_diffuse);  
  66.         glMaterialfv(GL_FRONT, GL_SPECULAR,  earth_mat_specular);  
  67.         glMaterialfv(GL_FRONT, GL_EMISSION,  earth_mat_emission);  
  68.         glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);  
  69.   
  70.         glRotatef(angle, 0.0f, -1.0f, 0.0f);  
  71.         glTranslatef(5.0f, 0.0f, 0.0f);  
  72.   
  73.         //如果使用glutSolidSphere函数来绘制球体,则该函数会自动的指定这些法线向量,  
  74.         //不必再手工指出。如果是自己指定若干的顶点来绘制一个球体,则需要自己指定法线向量。  
  75.         glutSolidSphere(2.0, 40, 32);  
  76.     }  
  77.   
  78.     glutSwapBuffers(); //交换缓冲区  
  79. }  
  80. void myIdle(void)  
  81. {  
  82.     angle += 1.0f;  
  83.     if( angle >= 360.0f )  
  84.         angle = 0.0f;  
  85.     myDisplay();  
  86. }  
  87.   
  88. int main(int argc, char* argv[])  
  89. {  
  90.     glutInit(&argc, argv);  
  91.     glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);  
  92.     glutInitWindowPosition(200, 200);  
  93.     glutInitWindowSize(WIDTH, HEIGHT);  
  94.     glutCreateWindow("OpenGL光照演示");  
  95.     glutDisplayFunc(&myDisplay);  
  96.     glutIdleFunc(&myIdle);  
  97.     glutMainLoop();  
  98.     return 0;  
  99. }  

0 0
原创粉丝点击