OpenGL中光照的设置

转自:http://blog.csdn.net/h88566/article/details/7587939


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 lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };
GLfloat local_view[] = { 0.0 };
 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
 glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);

 

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);


小结:

即使用 glLightfv 设置光(环境光、散射光等等)的颜色,使用 glLightModelfv设置关照的模式,使用glMaterialfv设置物体材料的颜色。


引用OpenGL编程指南中的例子:

[cpp]  view plain copy
  1. void init(void)  
  2. {  
  3.    GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };  
  4.    GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };  
  5.    GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };  
  6.    GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };  
  7.    GLfloat local_view[] = { 0.0 };  
  8.   
  9.    glClearColor(0.0, 0.1, 0.1, 0.0);  
  10.    glEnable(GL_DEPTH_TEST);  
  11.    glShadeModel(GL_SMOOTH);  
  12.   
  13.    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);  
  14.    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);  
  15.    glLightfv(GL_LIGHT0, GL_POSITION, position);  
  16.    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);  
  17.    glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);  
  18.   
  19.    glEnable(GL_LIGHTING);  
  20.    glEnable(GL_LIGHT0);  
  21. }  
  22.   
  23. void display(void)  
  24. {  
  25.    GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };  
  26.    GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };  
  27.    GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };  
  28.    GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 };  
  29.    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };  
  30.    GLfloat no_shininess[] = { 0.0 };  
  31.    GLfloat low_shininess[] = { 5.0 };  
  32.    GLfloat high_shininess[] = { 100.0 };  
  33.    GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};  
  34.   
  35.    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
  36.   
  37. /*  draw sphere in first row, first column 
  38.  *  diffuse reflection only; no ambient or specular   
  39.  */  
  40.    glPushMatrix();  
  41.    glTranslatef (-3.75, 3.0, 0.0);  
  42.    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);  
  43.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  44.    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);  
  45.    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);  
  46.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  47.    glutSolidSphere(1.0, 16, 16);  
  48.    glPopMatrix();  
  49.   
  50. /*  draw sphere in first row, second column 
  51.  *  diffuse and specular reflection; low shininess; no ambient 
  52.  */  
  53.    glPushMatrix();  
  54.    glTranslatef (-1.25, 3.0, 0.0);  
  55.    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);  
  56.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  57.    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);  
  58.    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);  
  59.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  60.    glutSolidSphere(1.0, 16, 16);  
  61.    glPopMatrix();  
  62.   
  63. /*  draw sphere in first row, third column 
  64.  *  diffuse and specular reflection; high shininess; no ambient 
  65.  */  
  66.    glPushMatrix();  
  67.    glTranslatef (1.25, 3.0, 0.0);  
  68.    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);  
  69.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  70.    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);  
  71.    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);  
  72.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  73.    glutSolidSphere(1.0, 16, 16);  
  74.    glPopMatrix();  
  75.   
  76. /*  draw sphere in first row, fourth column 
  77.  *  diffuse reflection; emission; no ambient or specular reflection 
  78.  */  
  79.    glPushMatrix();  
  80.    glTranslatef (3.75, 3.0, 0.0);  
  81.    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);  
  82.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  83.    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);  
  84.    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);  
  85.    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);  
  86.    glutSolidSphere(1.0, 16, 16);  
  87.    glPopMatrix();  
  88.   
  89. /*  draw sphere in second row, first column 
  90.  *  ambient and diffuse reflection; no specular   
  91.  */  
  92.    glPushMatrix();  
  93.    glTranslatef (-3.75, 0.0, 0.0);  
  94.    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);  
  95.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  96.    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);  
  97.    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);  
  98.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  99.    glutSolidSphere(1.0, 16, 16);  
  100.    glPopMatrix();  
  101.   
  102. /*  draw sphere in second row, second column 
  103.  *  ambient, diffuse and specular reflection; low shininess 
  104.  */  
  105.    glPushMatrix();  
  106.    glTranslatef (-1.25, 0.0, 0.0);  
  107.    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);  
  108.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  109.    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);  
  110.    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);  
  111.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  112.    glutSolidSphere(1.0, 16, 16);  
  113.    glPopMatrix();  
  114.   
  115. /*  draw sphere in second row, third column 
  116.  *  ambient, diffuse and specular reflection; high shininess 
  117.  */  
  118.    glPushMatrix();  
  119.    glTranslatef (1.25, 0.0, 0.0);  
  120.    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);  
  121.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  122.    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);  
  123.    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);  
  124.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  125.    glutSolidSphere(1.0, 16, 16);  
  126.    glPopMatrix();  
  127.   
  128. /*  draw sphere in second row, fourth column 
  129.  *  ambient and diffuse reflection; emission; no specular 
  130.  */  
  131.    glPushMatrix();  
  132.    glTranslatef (3.75, 0.0, 0.0);  
  133.    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);  
  134.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  135.    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);  
  136.    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);  
  137.    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);  
  138.    glutSolidSphere(1.0, 16, 16);  
  139.    glPopMatrix();  
  140.   
  141. /*  draw sphere in third row, first column 
  142.  *  colored ambient and diffuse reflection; no specular   
  143.  */  
  144.    glPushMatrix();  
  145.    glTranslatef (-3.75, -3.0, 0.0);  
  146.    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);  
  147.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  148.    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);  
  149.    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);  
  150.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  151.    glutSolidSphere(1.0, 16, 16);  
  152.    glPopMatrix();  
  153.   
  154. /*  draw sphere in third row, second column 
  155.  *  colored ambient, diffuse and specular reflection; low shininess 
  156.  */  
  157.    glPushMatrix();  
  158.    glTranslatef (-1.25, -3.0, 0.0);  
  159.    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);  
  160.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  161.    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);  
  162.    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);  
  163.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  164.    glutSolidSphere(1.0, 16, 16);  
  165.    glPopMatrix();  
  166.   
  167. /*  draw sphere in third row, third column 
  168.  *  colored ambient, diffuse and specular reflection; high shininess 
  169.  */  
  170.    glPushMatrix();  
  171.    glTranslatef (1.25, -3.0, 0.0);  
  172.    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);  
  173.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  174.    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);  
  175.    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);  
  176.    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);  
  177.    glutSolidSphere(1.0, 16, 16);  
  178.    glPopMatrix();  
  179.   
  180. /*  draw sphere in third row, fourth column 
  181.  *  colored ambient and diffuse reflection; emission; no specular 
  182.  */  
  183.    glPushMatrix();  
  184.    glTranslatef (3.75, -3.0, 0.0);  
  185.    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);  
  186.    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);  
  187.    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);  
  188.    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);  
  189.    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);  
  190.    glutSolidSphere(1.0, 16, 16);  
  191.    glPopMatrix();  
  192.   
  193.    glFlush();  
  194. }  
  195.   
  196. void reshape(int w, int h)  
  197. {  
  198.    glViewport(0, 0, w, h);  
  199.    glMatrixMode(GL_PROJECTION);  
  200.    glLoadIdentity();  
  201.    if (w <= (h * 2))  
  202.       glOrtho (-6.0, 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w,   
  203.          3.0*((GLfloat)h*2)/(GLfloat)w, -10.0, 10.0);  
  204.    else  
  205.       glOrtho (-6.0*(GLfloat)w/((GLfloat)h*2),   
  206.          6.0*(GLfloat)w/((GLfloat)h*2), -3.0, 3.0, -10.0, 10.0);  
  207.    glMatrixMode(GL_MODELVIEW);  
  208.    glLoadIdentity();  
  209. }  
  210.   
  211. int main(int argc, char** argv)  
  212. {  
  213.    glutInit(&argc, argv);  
  214.    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);  
  215.    glutInitWindowSize (600, 450);  
  216.    glutCreateWindow(argv[0]);  
  217.    init();  
  218.    glutReshapeFunc(reshape);  
  219.    glutDisplayFunc(display);  
  220.    glutKeyboardFunc (keyboard);  
  221.    glutMainLoop();  
  222.    return 0;   
  223. }  

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值