OpenGL中的颜色、光照和材质(六)——某个光照方案

来源:互联网 发布:软件下载万一网 编辑:程序博客网 时间:2024/05/17 09:16
六、某个光照方案
     本光照方案用于某CAD系统,因为只需体现对象的立体感,所以只考虑辐射光和漫射光,忽略环境光和镜面光。假定对象颜色为”R,G,B” ,辐射光材质取”0.4*R, 0.4*G, 0.4*B”,作为对象的底色,与光源无关,与法向无关。漫射光取”0.5, 0.5, 0.5”,漫射光材质取”R, G, B” ,对象表面的明暗效果随表面法向的不同而不同。
 
1.设置光照模式
GLfloat lightmodel_ambient[]={0.0, 0.0, 0.0, 1.0};              //全局环境光glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightmodel_ambient);     //全局环境光glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);                  //远视点glLightModeli(LIGHT_MODEL_TWO_SIDE, 0);                         //单面光照 
 
2.设置光源1
glEnable(GL_LIGHTING);                                          //打开光照计算glEnable(GL_LIGHT0);                                            //启动光源0glEnable(GL_LIGHT1);                                            //启动光源1//光源1GLfloat light0_ambient[] = { 0.0, 0.0, 0.0, 1.0 };              //环境光GLfloat light0_diffuse[]   = { 0.5, 0.5, 0.5, 1.0 };            //漫射光GLfloat light0_specular[] = { 0.0, 0.0, 0.0, 1.0 };             //镜面反射光GLfloat light0_position[]  = { 0.4, 0.8, 0.6, 0.0 };            //平行光方向glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
 
3.设置光源2
GLfloat light1_ambient[] = { 0.0, 0.0, 0.0, 1.0 };              //环境光GLfloat light1_diffuse[]   = { 0.5, 0.5, 0.5, 1.0 };            //漫射光GLfloat light1_specular[] = { 0.0, 0.0, 0.0, 1.0 };             //镜面反射光GLfloat light1_position[] = { -0.4, -0.8, 0.6, 0.0 };           //平行光方向glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);glLightfv(GL_LIGHT1, GL_POSITION, light1_position);

4.设置材质
GLfloat mat_emission[] = { 0.4*R, 0.4*G, 0.4*B, 1.0};           //辐射光材质GLfloat mat_ambient[]  = { 0.0, 0.0, 0.0, 1.0};                 //环境光材质GLfloat mat_diffuse[]    = { R, G, B, 1.0};                     //漫射光材质GLfloat mat_specular[]  = { 0.0, 0.0, 0.0, 1.0 };               //镜面光材质GLfloat mat_shininess[] = { 100.0 };                            //镜面指数glMaterialfv(GL_FRONT,GL_EMISSION, mat_emission);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
 
5.光照方向示意图
   

6.光照效果图
 

原创粉丝点击