文档介绍:OpenGL的光照和材质
GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR这三种属性是光源和材质所共有的,如果某光源发出的光线照射到某材质的表面,则最终的漫反射强度由两个GL_DIFFUSE属性共同决定,最终的镜面反射强度由两个GL_SPECULAR属性共同决定。
在OpenGL中,仅仅支持有限数量的光源。使用GL_LIGHT0表示第0号光源,GL_LIGHT1表示第1号光源,依次类推,OpenGL至少会支持8个光源,即GL_LIGHT0到GL_LIGHT7。使用glEnable函数可以开启它们。例如,glEnable(GL_LIGHT0)可以开启第0号光源。使用glDisable函数则可以关闭光源。一些OpenGL实现可能支持更多数量的光源,但总的来说,开启过多的光源将会导致程序运行速度的严重下降,
光源GL_LIGHT0与其他几个光源不同,
GL_DIFFUSE,GL_SPECULAR的默认值是(,,,)
而其他光源的默认值是(,,,)。
使用OpenGL的光照模型包括以下几个步骤:
1 设置光源的种类、位置和方向(对于平行光源)
2 为每个图元的每个顶点指定它的法线向量
3 为各个图元指定它的材质
4 启用光照模型
OpenGL的光照和材质
1 光源设置:
设置环境光:glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
设置漫射光成分:glLightfv(GL_LIGHT0,GL_DIFFUSE,DiffuseLight)
设置镜面光成分:glLightfv(GL_LIGHT0,GL_SPECULAR,SpecularLight);
光源的属性GL_SPECULAR影响镜面反射区域的颜色,一般物体的镜面反射区域的颜色为入射光线的颜色,要实现真实感,应该将它的值设置成与GL_DIFFUSE相同。
设置光源的位置:glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position);
GL_POSITION属性,表示光源所在的位置。由四个值(X, Y, Z, W)表示。
方向性光源第四个值W为零,则表示该光源位于无限远处,前三个值表示了它所在的方向。通常,太阳可以近似的被认为是方向性光源。
位置性光源第四个值W不为零,则X/W, Y/W, Z/W表示了光源的位置。这种光源称为位置性光源。
定位光源需要对其发射的光进行衰减,可以设置各种衰减因子。环境光,散射光和镜面反射光的贡献都是衰减的,只有发射光和全局环境光不会衰减。
OpenGL的光照和材质
下面定义了一个位置在(1,1,1),没有环境光,镜面反射光和漫反射光都为白光的光源:
GLfloat light_position[] = { , , , };
GLfloat light_ambient [] = { , , , };
GLfloat light_diffuse [] = { , , , };
GLfloat light_specular[] = { , , , };
glLightfv(GL_LIGHT0, GL_POSITION