




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.1光照技术,图6-5(a)经过光照计算的球(b)不经过光照计算的球,单纯判别物体表面的可见性,远远不能反映物体表面的真实感。,物体表面所呈现的颜色是由表面向视线方向辐射进入人眼中光决定的。建立数学模型模拟物体表面的光照明物理现象,按照数学模型计算物体表面向视线方向辐射进入人眼中的光亮度,即可获得像素所对应的物体上的可见点的颜色,这样绘制出来的图形具有较强的真实感,如图6-5(a)。这些数学模型就称为明暗效应模型或者光照明模型。,当光照射到物体表面时,光可能被吸收、反射和透射,被物体吸收的部分转化为热,只有反射、透射的光能够进入人眼产生视觉效果,它们决定了物体所呈现的颜色。如果物体是不透明的,则透射光不存在,物体的颜色仅由反射光决定。这种情形正是简单光照模型需要考虑的,简单光照模型只考察光源直接照射下物体表面的反射情况。,光学反射模型,通常物体表面的反射光可以认为包含三个分量:对环境光的反射、对特定光源的漫反射和镜面反射。,环境光的反射:环境光(ambientlight)来自周围环境(如墙面)散射的光,在空间近似均匀分布,入射至物体表面后向空间各个方向均匀反射出去。物体对环境光的反射分量表示:,其中Ia是入射的环境光亮度,Ka是环境光漫反射系数,它与物体表面性质有关。如果简单光照模型中仅考虑环境光的反射分量,则物体表面的亮度是一个恒定值,没有明暗的自然过渡。,散射(diffusereflection):散射分量表示特定光源在物体表面的反射光中那些向空间各个方向均匀反射出去的光。兰伯特(Lambert)余弦定律指出:当点光源照射到一个散射体时,其表面反射光亮度和光源入射角(入射光线和表面法矢量的夹角)的余弦成正比,即,其中Il是来自点光源的入射光亮度。Kd是漫反射系数,与物体表面性质有关。是入射光线和表面法矢量的夹角(如果90?)。,兰伯特反射光照模型,只考虑对环境光的反射分量和对特定光源的散射分量,则物体表面的反射光亮度为:,适用于粗糙、无光泽的物体,如粉笔、黑板。对于擦亮的金属、光滑的塑料等光亮物体需要计算镜面反射。,镜面反射(specularreflection):表示特定光源在物体表面的反射光中那些遵循反射定律的光。对于纯镜面,反射光和入射光对称地分布在表面法向的两侧。对于一般光滑表面,表面可理解为由许多朝向不同的微小平面构成,入射光经许多微小平面反射后形成的反射光不再是单向的,而是分布于理想镜面反射方向的周围。通常采用余弦函数的幂次来模拟一般光滑表面的镜面反射光的空间分布。,Il是入射光亮度。Ks是物体表面镜面反射系数,为理想镜面反射方向与视线方向的夹角,n为镜面反射光的会聚指数。,Phong光照模型,考虑环境光、散射和镜面反射,则物体表面的反射光亮度为:,实际上光的亮度与传播距离的平方成反比,Il为光源处的光亮度,光线抵达物体表面以及从物体表面反射进入观察者眼睛的过程中存在衰减的问题。漫反射分量和镜面反射分量应该乘以一个衰减因子,以取得远的物体看起来暗些的效果。当场景的投影变换采用透视投影时,Warnock提出线性衰减因子1/d,而Rommey提出衰减因子1/dp可以取得比较真实的效果。此时Phong光照模型可以进一步描述为:,其中d是物体上当前考察点到视点的距离,K是一个任意的常量,。,计算物体上可见点光亮度时通常是将光亮度转换成为光栅图形显示器采用的RGB三基色,这时计算需要在三个基色上分别进行。如果存在多个光源,则将效果线性相加。此时光照模型可以描述为:,建立简单光照模型后,就可以用于消隐算法中计算像素所对应的物体上可见点的亮度。,明暗处理,图6-7(a)多边形表示的物体(b)Gouraud明暗处理,光照计算时需要用到多边形上点的法矢量,如果多边形上点的法矢量总是取多边形的面法矢,则由于不同平面片之间法矢量不连续,最终绘制出来的图像看起来呈多面体状。,解决方法:首先多边形的顶点法矢量不再简单的取为其所在多边形的面法矢,而是取为共该顶点的所有多边形的面法矢的平均值;其次多边形内部点的法矢量也不再简单地取为多边形的面法矢,而是利用多边形顶点的法矢量通过双线性插值计算出。,图6-8对P点进行双线性插值,Phong明暗处理(插值法矢),如图6-8,P1、P2、P3是多边形顶点,其法矢量视为共该点的所有多边形法矢量的平均值。由P1、P2的法矢量可以线性插值计算出A点的法矢量,由P1、P3的法矢量可以线性插值计算出B点的法矢量,于是P点的法矢量可以由A、B点处的法矢量线性插值计算出,计算出P的法矢量后应用简单光照模型可以计算出P点的光亮度。,Gouraud明暗处理(插值颜色),由于每个像素点都需要法向量插值和光照计算,Phong明暗处理计算量较大,一种简化的处理方法是先利用光照模型计算出多边形顶点处亮度,然后对亮度进行双线性插值,直接获得像素的颜色,如图6-8,P1、P2、P3是多边形顶点,其亮度已经计算出。A点的亮度可以由P1、P2点的亮度线性插值计算出,B点的亮度可以由P1、P3点的亮度线性插值计算出,于是P点的亮度可以由A、B点的亮度线性插值计算出。,Phong明暗处理计算量远大于Gouraud明暗处理,但效果好。,5.2OpenGL中的光照,OpenGL提供的函数可以方便地实现隐藏面消除、光照计算、纹理映射。OpenGL中隐藏面的消除采用的是Z缓冲器算法。glEnable(GL_DEPTH_TEST)和glDisable(GL_DEPTH_TEST)打开和禁止深度测试。OpenGL进行光照计算时采用的是简单光照模型,只考虑光源直接照射下物体表面的反射,不考虑光在物体间的反射和光的透射。glEnable(GL_LIGHTING)和glDisable(GL_LIGHTING)打开和禁止光照计算。,OpenGL认为物体表面的反射光包含三个分量:物体本身发出的光、对环境光的反射,对特定光源的反射。物体本身发出的光。OpenGL认为物体本身是可以发光的,但是这种光只会对物体本身的亮度产生影响,不能影响其它物体的光亮度。物体本身发出的光记为。对环境光的反射。这里的环境光指的是全局环境光,它不依赖于任何特定光源。全局环境光概念的提出使得即使场景中没有任何光源,观察者也可以看到物体。假设全局环境光亮度Iglobal,物体表面的环境光反射系数为Ka,则物体对全局环境光的反射为。对特定光源的反射。,在OpenGL中,光源被定义为聚光灯。定义一个聚光灯需要指定光源的位置(即锥顶),聚光灯的方向(即圆锥轴的方向),聚光灯的散射角(即圆锥中轴和边的夹角)。聚光灯将光的发射形状调整为圆锥形,此时空间光强度分布可以用聚光灯光强分布系数乘以锥顶处聚光灯光强给出。,图6-15视线和反射光线夹角图6-16聚光灯,综合三个分量,在OpenGL中物体表面的反射光亮度为:,参照P170做解释。,为减小计算量,OpenGL采用Gouraud明暗处理方法。glShadeModel(GL_SMOOTH)和glShadeModel(GL_FLAT)形式的函数调用来设置。,图6-15视线和反射光线夹角图6-16聚光灯,6.6.1、光照模型介绍例程:ep_7_1_光照球,6.6.1、光照模型OpenGL光组成在OpenGL简单光照模型中的几种光分为:辐射光(EmittedLight)、环境光(AmbientLight)、漫射光(DiffuseLight)、镜面光(SpecularLight)。辐射光是最简单的一种光,它直接从物体发出并且不受任何光源影响。环境光是由光源发出经环境多次散射而无法确定其方向的光,即似乎来自所有方向。一般说来,房间里的环境光成分要多些,户外的相反要少得多,因为大部分光按相同方向照射,而且在户外很少有其他物体反射的光。当环境光照到曲面上时,它在各个方向上均等地发散(类似于无影灯光)。,6.6.1、光照模型OpenGL光组成漫射光来自一个方向,它垂直于物体时比倾斜时更明亮。一旦它照射到物体上,则在各个方向上均匀地发散出去。于是,无论视点在哪里它都一样亮。来自特定位置和特定方向的任何光,都可能有散射成分。镜面光来自特定方向并沿另一方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射。光亮的金属和塑料具有很高非反射成分,而象粉笔和地毯等几乎没有反射成分。,6.6.1、光照模型创建光源(LightSource)光源有许多特性,如颜色、位置、方向等。选择不同的特性值,则对应的光源作用在物体上的效果也不一样,这在以后的章节中会逐步介绍的。下面详细讲述定义光源特性的函数glLight*():voidglLightifv(GLenumlight,GLenumpname,TYPEparam)创建具有某种特性的光源。其中第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、.、GL_LIGHT7。第二个参数pname指定光源特性,这个参数的辅助信息见表10-1所示。最后一个参数设置相应的光源特性值。,6.6.1、光照模型,6.6.1、光照模型创建光源举例(1)指定光源的位置:GLfloatlight_position=1.0,1.0,1.0,0.0;glLightfv(GL_LIGHT0,GL_POSITION,light_position);GLfloatlight_ambient=0.0,0.0,0.0,1.0;GLfloatlight_diffuse=1.0,1.0,1.0,1.0;GLfloatlight_specular=1.0,1.0,1.0,1.0;(2)指定环境光颜色、散射光、镜面反射光glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);,6.6.1、光照模型启动光照在OpenGL中,必须明确指出光照是否有效或无效。如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算,那么显示的图形就没有真实感(举例“光照球”)。要使光照有效,首先得启动光照计算,即:glEnable(GL_LIGHTING);若使光照无效,则调用gDisable(GL_LIGHTING)可关闭当前光照。然后,必须使所定义的每个光源有效,即:glEnable(GL_LIGHT0);其它光源类似,只是光源号不同而已。,6.6.2、材质材质颜色OpenGL用材料对光的红、绿、蓝三原色的反射率来近似定义材料的颜色。象光源一样,材料颜色也分成环境、漫反射和镜面反射成分,它们决定了材料对环境光、漫反射光和镜面反射光的反射程度(或者说成反射系数与前面的理论对应)。在进行光照计算时,材料对环境光的反射率与每个进入光源的环境光结合,对漫反射光的反射率与每个进入光源的漫反射光结合,对镜面光的反射率与每个进入光源的镜面反射光结合(相乘)。对环境光与漫反射光的反射程度决定了材料的颜色,并且它们很相似。对镜面反射光的反射率通常是白色或灰色。镜面反射高光最亮的地方将变成具有光源镜面光强度的颜色。例如一个光亮的红色塑料球,球的大部分表现为红色,光亮的高光将是白色的。,6.6.2、材质材质定义材质的定义与光源的定义类似。其函数为:voidglMaterialifv(GLenumface,GLenumpname,TYPEparam);定义光照计算中用到的当前材质。face可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK,它表明当前材质应该应用到物体的哪一个面上;pname说明一个特定的材质;param是材质的具体数值,若函数为向量形式,则param是一组值的指针,反之为参数值本身。非向量形式仅用于设置GL_SHINESS。pname参数值具体内容见下表。,6.6.2、材质材质定义材质的定义与光源的定义类似。其函数为:voidglMaterialifv(GLenumface,GLenumpname,TYPEparam);,6.6.2、材质材质举例voidCALLBACKvoidmyinit(void)/*设置材质的各种光的颜色成分反射比率*/GLfloatmat_ambient=0.8,0.8,0.8,1.0;GLfloatmat_diffuse=0.8,0.0,0.8,1.0;/*紫色*/GLfloatmat_specular=1.0,0.0,1.0,1.0;/*亮紫色*/GLfloatmat_shininess=50.0;GLfloatlight_position=1.0,1.0,1.0,0.0;glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glDepthFunc(GL_LESS);glEnable(GL_DEPTH_TEST);,6.6.2、材质材质举例voidCALLBACKdisplay(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);auxSolidSphere(1.0);glFlush();以上程序运行结果是一个紫色的球,6.6.2、材质材质RGB值和光源RGB值的关系材质的颜色与光源的颜色有些不同。对于光源,R、G、B值等于R、G、B对其最大强度的百分比。若光源颜色的R、G、B值都是1.0,则是最强的白光;若值变为0.5,颜色仍为白色,但强度为原来的一半,于是表现为灰色;若RG1.0,B0.0,则光源为黄色。对于材质,R、G、B值为材质对光的R、G、B成分的反射率。比如,一种材质的R1.0、G0.5、B0.0,则材质反射全部的红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若OpenGL的光源颜色为(LR、LG、LB),材质颜色为(MR、MG、MB),那么,在忽略所有其他反射效果的情况下,最终到达眼睛的光的颜色为(LR*MR、LG*MG、LB*MB)。对于两束光,相应的值分别为(R1、G1、B1)和(R2、G2、B2),则OpenGL将各个颜色成分相加,得到(R1+R2、G1+G2、B1+B2),若任一成分的和值大于1(超出了设备所能显示的亮度)则约简到1.0。下面一例程就说明了二者之间的关系。,6.6.2、材质材质RGB值和光源RGB值的关系举例GLfloatmat_ambient=0.8,0.8,0.8,1.0;GLfloatmat_diffuse=0.8,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 影视作品烟雾机租赁与特效制作合同
- 高效冲击试验机租赁及材料抗冲击性能改进合同
- 区块链智能合约法律审查与合同执行监督合同
- 模块化建筑幕墙胶缝更换与装配式建筑合同
- 电视综艺节目艺人化妆造型合同
- 国际工程建设项目人力资源外包与派遣协议
- 红码与黄码人员处置流程
- 小班艺术活动美丽的花朵
- 神经系统肿瘤综合诊疗进展
- 遗产继承法律事务代理合同(2篇)
- GB 1886.25-2016食品安全国家标准食品添加剂柠檬酸钠
- ETERM指令讲解解析
- 畜禽解剖生理-神经系统
- 宁波东钱湖新城核心区项目整体定位与发展战略课件
- 混凝土随机损伤力学课件
- 基于matlab的同步发电机励磁系统仿真分析与
- 建设工程项目开工备案表
- 危险化学品MSDS(二乙二醇)
- 中国铁建股份公司专业技术职务任职资格评审暂行规定
- 学校食堂餐厅紫外线灯消毒记录表
- (完整版)业务连续性计划BCP
评论
0/150
提交评论