文档介绍:1
第 5 章
OpenGL光照和材质
当光照射到一个物体表面上时,会出现三种情形。首先,光可以通过物体表面向空间反射,产生反射光。其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光。最后,部分光将被物体表面吸收而转换成热。在上述三部分光中,仅仅是透射光和反射光能够进入人眼产生视觉效果。
(1)环境光(Ambient Light)
环境光不来自于任何特殊的方向,它有光源,但是被周围的房间或场景多次反射,以致于变得没有方向。被环境光照射的物体表面的各个方向都均等受光。
(2)散射光(Diffuse Light)
来自同一个方向的光,垂直照射表面比倾斜时更明亮。
当它撞击表面时,它会均匀的向所有方向发散,因此,不管眼睛在哪个位置,它看上去总是一样亮。
任何来自某个特定位置或方向的光很可能具有散射成分。
(3)镜面光( Specular Light )
镜面光来自特定方向,但被强烈地反射到另一特定的方向。高亮度的镜面光能够在被照射的物体表面上产生称之为亮斑的亮点。
(4)发射光(emitted light)
用于模拟源自某个物体的光。
任何一个光源都是由环境光、散射光和镜面光三种光照成分组成,各成分的定义是由RGBA值定义的。
材质
OpenGL用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。像光源一样,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。
在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合。
材质的颜色实际决定了反射光与入射光的百分比率:若OpenGL的光源颜色为(LR、LG、LB),材质颜色属性为(MR、MG、MB)。那么,最终到达眼睛的光的颜色为
(LR*MR、LG*MG、LB*MB)
三种光照成分的RGBA值叠加就形成了物体最终的颜色。,。
使用光照的一般步骤:
为物体的所有顶点定义法线向量。决定物体相对于光源的朝向。
创建光源、设置位置。
创建和选择光照模型,它定义了全局环境光的等级和观察点的位置。
并启用光照和对应光源。
设置物体的材料属性。
OpenGL光照模型
法线向量
法线向量:垂直于表面的向量。
法线决定了物体相对于光线的方向。
在OpenGL中,可以给一个多边形指定法线,也可以给每个顶点指定法线,但不能在顶点以外的其他地方指定法线。
对于每个顶点,OpenGL根据指定的法线来确定有多少来自光源的光将照射到该顶点上。
设置法线函数:
void glNormal3*[v](TYPE nx, TYPE ny, TYPE nz)
该函数指定一个向量(nx,ny,nz),并被作为法线,
接下来在调用glVertex*()函数时,当前法线被赋值给
指定的顶点
法线向量仅表示方向,长度无关紧要,在计算光照之前,必须将法线向量的长度转换为1 ,称为法线的规范化,可调用以下函数进行法线向量的自动规范化:
glEnable(GL_NORMALIZE);
法线向量
创建光源
指定光源属性函数:
void glLight{if}(GLenum light,
GLenum pname,TYPE param);
创建light所指定的光源,可以是GL_LIGHT0,
GL_LIGHT1,….,GL_LIGHT7,pname定义被设置的光
源属性,它指定一个命名参数,param表示pname属
性将要设置的值。