光照原理

OpenGL 光照

1. 光照简介  
     采用光照要做的工作包括:创建光源,激活光照以及光源,以及定义物体的材质。创建光源是要定义光源的特征,物体的材质则与光源一起决定到达人眼的光的颜色。若光源颜
色为(LR,LG,LB ),材质颜色为(MR,MG,MB ),则到达人眼的颜色为(LR*MR,LG*MG,LB*MB )。  

2.简单光照模型
     一般来说,反射光可以分成三个分量,即环境反射、漫反射和镜面反射。环境反射分量假定入射光均匀地从周围环境入射至景物表面并等量地向各个方向反射出去,通常物体表 面还会受到从周围环境来的反射光(如来自地面、天空、墙壁等的反射光)的照射,这些光常统称为环境光(Ambient  Light );漫反射分量表示特定光源在景物表面的反射光中那些向空间各方向均匀反射出去的光,这些光常称为漫射光(Diffuse Light );镜面反射光为朝一定方向的反射光,如一个点光源照射一个金属球时会在球面上形成一块特别亮的区域,呈现所谓“高光(Highlight )”,它是光源在金属球面上产生的镜面反射光(Specular Light)。对于较光滑物体,其镜面反射光的高光区域小而亮;相反,粗糙表面的镜面反射光呈发散状态,其高光区域大而不亮。

3.OpenGL光源 
     光源有许多特性,如颜色、位置、方向等。选择不同的特性值,则对应的光源作用在 物体上的效果也不一样,下面的函数定义了OpenGL 的光源。  
     void glLightfv(GLenum light , GLenum pname, TYPEparam)
     其中第一个参数 light指定所创建的光源号,如 GL_LIGHT0 、GL_LIGHT1 、...、GL_LIGHT7。第二个参数pname指定光源特性,这个参数的具体信息见下表所示。最后一个参数设置相应的光源特性值。  

          pname 参数名                                                        说明

        GL_AMBIENT                                                 RGBA 模式下环境光

        GL_DIFFUSE                                                 RGBA 模式下漫反射光

        GL_SPECULAR                                             RGBA 模式下镜面光

        GL_POSITION                                                光源位置齐次坐标(x,y,z,w )

        GL_SPOT_DIRECTION                                点光源聚光方向矢量(x,y,z )

        GL_SPOT_EXPONENT                                 点光源聚光指数

        GL_SPOT_CUTOFF                                      点光源聚光截止角


例如:下面定义了一个位置在(1,1,1),没有环境光,镜面反射光和漫反射光都为白光的光源
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };  
GLfloat light_ambient [] = { 0.0, 0.0, 0.0, 1.0 };
GLfloat light_diffuse [] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT , light_ambient );
glLightfv(GL_LIGHT0, GL_DIFFUSE , light_diffuse );

glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
创建光源后,要使用  
     glEnable(GL_LIGHTING);
     glEnable(GL_LIGHT0);
来启动光照和一号光源。

4.材质  
     OpenGL  用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。象光源一样,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度。在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反射光结合,对镜面 光的反射率与每个进入光源的镜面反射光结合。对环境光与漫反射光的反射程度决定了材料的颜色,并且它们很相似。对镜面反射光的反射率通常是白色或灰色(即对镜面反射光中红、绿、蓝的反射率相同)。镜面反射高光最亮的地方将变成具有光源镜面光强度的颜色。例如一个光亮的红色塑料球,球的大部分表现为红色,光 亮的高光将是白色的。  
     材质的颜色与光源的颜色有些不同。对于光源,R、G、B 值等于 R、G、B 对其最大强度的百分比。若光源颜色的R、G、B 值都是 1.0,则是最强的白光;若值变为0.5,颜色仍为白色,但强度为原来的一半,于是表现为灰色;若R=G=1.0,B=0.0,则光源为黄色。对于材 质,R、G、B 值为材质对光的R、G、B 成分的反射率。比如,一种材质的R=1.0、G=0.5、B=0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若 OpenGL 的光源颜色为(LR、LG、LB ),材质颜色为(MR、MG、MB ),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR*MR、LG*MG、LB*MB )。 材质的定义与光源的定义类似。其函数为:void glMaterialfv(GLenum face,GLenum pname,TYPE param);定 义 光 照计 算 中 用 到 的 当 前 材 质 。face          可 以 是  GL_FRONT  、 GL_BACK  、GL_FRONT_AND_BACK,它表明当前材质应该应用到物体的哪一个面上;pname说明一个特定的材质;param       是材质的具体数值。pname          参数值具体内容见下表。另外,参数GL_AMBIENT_AND_DIFFUSE 表示可以用相同的RGB 值设置环境光颜色和漫反射光颜色。

            参数名                                                                            说明


         GL_AMBIENT                                                         材料的环境光颜色

         GL_DIFFUSE                                                       材料的漫反射光颜色

         GL_AMBIENT_AND_DIFFUSE                           材料的环境光和漫反射光颜色

         GL_SPECULAR                                                    材料的镜面反射光颜色

         GL_SHININESS                                                   镜面指数(光亮度)

         GL_EMISSION                                                      材料的辐射光颜色


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值