六、某个光照方案
本光照方案用于某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); //启动光源0
glEnable(GL_LIGHT1); //启动光源1
//光源1
GLfloat 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.光照效果图