OpenGL至少支持8个光源。要查询OpenGL实现支持的光源数,可调用glGetIntegerv()。
要启用或者禁用光源,分别使用glEnable(GL_LIGHTi)和glDisable(GL_LIGHTi),其中i的可能取值为0到GL_MAX_LIGHTS-1。
创建光源
光源具有颜色、位置和方向等属性。
定义光源的颜色和位置
GLfloat ambient[] = { 0.2, 0.2, 0.2, 1.0 }; // 环境光
GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; //漫射光
GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat position[] = { 3.0, 3.0, 2.0, 0.0 };
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHTO, GL_SPECULAR, specular);
glLightfv(GL_LIGHT0, GL_POSITION, position);
用数组定义参数,并且反复通过 glLightfv()函数设置不同的参数。
GL_AMBIENT |
光的环境强度 |
(0,0,0,1) |
GL_DIFFUSE |
光的散射强度 light0的默认值是白色,其他是黑色 |
(1,1,1,1)或(0,0,0,1) |
GL_SPECULAR |
光的镜面强度 light0的默认值是白色,其他是黑色 |
(1,1,1,1)或(0,0,0,1) |
GL_POSITION |
表示光源位置的坐标(x,y,z,w) |
(0,0,1,0) |
GL_AMBIENT参数表示一个特定的光源在场景中所添加的环境光的RGBA强度。
GL_DIFFUSE参数可能最接近于我们想要光的颜色。它定义了特定光源在场景中所添加的散射光的RGBA强度。
GL_SPECULAR参数影响物体上镜面亮点的颜色。如果要创建逼真的效果GL_SPECULAR和GL_DIFFUSE参数设置的值应该相同。
位置和衰减
GLfloat position[] = { 1.0, 1.0, 1.0, 0.0 };
glLightfv(GL_LIGHT0, GL_POSITION, position);
GL_POSITION包含四个参数(x,y,z,w)。如果最后一个(w)为0,表示对应光源是方向光源,(x,y,z)描述了它的方向。在默认情况下(0,0,1,0)定义了一个指向z轴负方向的方向性光源。
使用glColor()修改材质参数
当光照被启用opengl使用glMaterialfv()设置当前材质的颜色;如果光照被禁用,则使用
glColor3f()设置当前主颜色。
glMaterialfv(face,pname,TYPE*param)
OpenGL分别为正面和背面图元存储一组材质参数,face指定函数调用将影响那组参数。除非使用双面光照,否则将face设置为GL_FRONT 。pname的合法取值包括GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR