品寒绝顶 雪舞人间

Home
Up

OpenGL Step by Step

第十、光照效果

三维图形处理很大程度上就是光与影的艺术。光照会在物体表面形成明暗过渡,计算机图形只有模拟出这种效果才会有真实感。

OpenGL支持光照计算,而且新一代的显卡(如GeForce256)硬件支持光照甚至动态光源。在OpenGL中用glEnable(GL_LIGHTING);打开光照计算。

打开光照计算之后,如果场景中没有光源,那么什么也看不见。OpenGL中同时支持GL_MAX_LIGHTS个光源,它们的名字是:GL_LIGHT0、GL_LIGHT1、GL_LIGHT2……。用glEnable/Disable(GL_LIGHTx) 开关这些光源。

每一盏灯(即光源)都有位置、方向、材质、照射范围、衰减因子等许多参数,默认参数值得到的是沿-Z轴方向的平行有指向性光源。这些参数基本的用法如下:

    1. 位置:即发光点所在的坐标,默认为(0,0,1,0)。该坐标为齐次坐标,第四个坐标n可决定光源的类型。n=0时为平行光,n=1时为点光源。前者可用来模拟日光等,后者可以用来模拟灯火。
      glLight*(GL_LIGTHx,GL_POSITION,坐标); 命令指定光源位置。
    2. 材质:即该光源开成的环境光、漫射光、高光的颜色。光源的材质与物体表面材质共同决定表面最终的视觉效果。参数含参见8.颜色材质。
      用glLight*(GL_LIGHTx,GL_AMBIENT/DIFFUSE/SPECULAR,RGBA);设定。
    3. 象电灯泡、蜡烛之类的光源,光线射向各个方向形成光球,这种光源是无所谓方向的,我们称之为无指向性点光源。而日光灯管则是无指向性平行光源。太阳光是有指向性平行光源。聚光灯是有指性点光源。
      聚光方向用glLight*(GL_LIGHTx,GL_SPOT_DIRECTION,方向矢量);定义。
    4. 聚光灯只照亮它发射出的光锥之内的物体,光锥的张角可以用glLigth*(GL_LIGHTx,GL_SPOT_CUTOFF,张角度数/2);指定。正常情况下,光锥中心部最亮,越往边缘越暗,这个变化过程用GL_SPOT_EXPONENT参数控制。聚光指数E的作用是:令光射线方向与灯的方向夹角为θ,该光射线产生的光强=聚光灯光强*(cosθ)E,E∈[0,128]
    5. 光在传播过程中是会衰减的,离光源越远光照越暗。这可以用GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION三个参数来控制。令光源初始光强为I,三个衰减因子依次为ac,al,aq,顶点与光源的距离为d,则该光源照到该顶点上的光强为I/(ac+al*d+aq2*d)

场景中可以同时打开多盏灯,所有的光源的行为方式受glLightModel*()命令控制。具体说来就是可以用GL_LIGHT_MODEL_AMBIENT设定背景光亮[默认(0.2, 0.2, 0.2, 1.0)]; 用 GL_LIGHT_MODEL_LOCAL_VIEWER决定高光反射角是以视线方向平行-Z轴计算(0,快),还是根据顶点的眼坐标计算(非0,准);以及前边介绍过的GL_LIGHT_MODEL_TWO_SIDE决定是否计算背面的光照效果。

©pinxue 2000.2.20