接上文 计算机图形学 学习笔记(十二):颜色模型,简单 / 增量 光照模型
9.4 局部光照模型和光透射模型
什么是局部光照模型
局部光照模型:仅处理光源直接照射物体表面的光照模型。
简单光照模型是一个比较粗糙的经验模型,不足之处是:镜面反射项与物体表面的材质无关。
从光电学知识和物体微平面假设出发,介绍镜面反射与物体材质有关的普遍局部光照模型。
局部光照模型
自然光反射系数可用 Fresnel 公式计算:
微观情况下,物体表面粗糙不平,如下所示:
宏观上来看,这是一个平面,法向朝上。实际上它是由许多微小平面构成的,微小平面的法向是各异的。
反射率计算
微平面是理想镜面,反射率可以用 Fresnel 公式计算,而粗糙表面的反射率与表面的粗糙度有关。
实际物体反射率:
Torrance 和 Sparrow 采用 Gauss 分布函数模拟法向分布:
衰减因子 G 在局部光照模型中也可以反映物体表面的粗糙程度。衰减因子是由于微平面的相互遮挡或屏蔽而产生的。
微平面相互遮挡的光衰减因子 G,有以下三种情况:
Cook 和 Torrance 于1981年提出了局部光照模型。
局部光照模型 表示
简单与局部模型比较
局部光照模型的优点
相对于简单光照模型而言:
- 局部光照模型是基于入射光能量导出的光辐射模型
- 反映表面的粗糙度对反射光强的影响
- 高光颜色与材料的物体性质有关
- 改进入射角很大时的失真现象
- 考虑了物体材质的影响,可以模拟磨光的金属光泽
Whitted 光透射模型
9.5 整体光照模型
为什么需要整体光照模型
简单和局部光照模型不能很好地模拟光的折射、反射和阴影等,也不能用来表示物体间的相互光照影响。
整体光照模型是更精确的光照模型,主要有光线跟踪和辐射度两种方法。
光线跟踪
光线跟踪基本原理
光线跟踪算法是真实感图形学中的主要算法之一,该算法具有原理简单、实现方便和能够生成各种逼真的视觉效果等突出的优点,综合考虑了光的反射、折射、阴影等。
光线跟踪怎么停止
在算法应用的意义上,可以由以下几种终止条件:
- 该光线没有碰到任何物体
- 该光线碰到了背景
- 光线在经过许多次反射和折射以后,就会产生衰减,光线对于视点的光强贡献很小
- 光线反射或折射次数即跟踪深度大于一定的值
光线跟踪伪代码
光线跟踪算法的函数名为 RayTracing(),光线的起点为 start ,方向为 direction,光线的衰减权值为 weight,初始值为1,算法最后返回光线方向上的颜色值 color。
对于每一个像素点,第一次调用 RayTracing(),可以设起点 start 为视点,而 direction 为视点到该像素点的射线方向。
光线跟踪的缺点
光线跟踪方法由于要进行大量的求交运算,且每一条射线都要和所有物体求交,因此效率很低,需要耗费大量的计算时间。
光线跟踪方法可以进行加速。
光线跟踪加速
- 提高求交速度:针对性的几何算法
- 减少求交次数:包围盒、空间索引
- 减少光线条数:颜色插值、自适应控制
- 采用广义光线和采用并行算法
光线跟踪场景渲染
9.6 纹理映射和阴影处理
纹理映射
什么是纹理和纹理映射
纹理有什么用
表面可以用纹理来代替,不用痛苦地构造模型和材质细节,节省时间和资源,让用户做其他更重要的东西。
可以用一个粗糙的多边形和纹理来代替详细的几何构造模型,可以节省时间和资源。
纹理分类
颜色纹理:颜色或明暗度变化体现出来的表面细节,如木材表面的木纹。
几何纹理:由不规则的细小凹凸体现出来的表面细节,如橘子皮表面的皱纹。
图形学中纹理定义
在真实感图形学中,可以用下列两种方法来定义纹理:
- 图像纹理:将二维纹理图案映射到三维物体表面,绘制物体表面上一点时,采用响应的纹理图案中相应点的颜色值。
- 函数纹理:用数学函数定义简单的二维纹理图案,如方格地毯或用数学函数定义随机高度场,生成表面粗糙纹理即几何纹理。
纹理映射定义
纹理映射:通过将数字化的纹理图像覆盖或投射到物体表面而为物体表面增加表面细节的过程。
1974年 catmull 首次提出了纹理映射的概念,其主要思想是通过寻找一种从纹理空间(u,v)到三维曲面(s,t)之间的映射关系,将点(u,v)对应的彩色参数值映射到相应的三维曲面(s,t)上,使三维曲面表面得到彩色图案。
颜色纹理坐标转换通常使用下列两种方法:
几何纹理则使用一个称为 扰动函数 的数学函数进行定义。
扰动函数通过对景物表面各个采样点的位置作微小扰动来改变表面的微观几何形状。
阴影处理
什么是阴影
阴影是由于观察方向与光源方向不重合而造成的。
阴影使人感到画面上景物的远近深浅,从而极大地增强画面的真实感。
什么是本影
场景中的一个点 P,如果它不被光源的任何一部分所照射到,就称为在本影区里。本影就是不被任何光源所照到的区域。
什么是半影
阴影是半影和本影的组合。半影和本影的并集就是阴影。下图绿色部分是半影:
阴影
自身阴影:由于物体自身的遮挡而使光线照射不倒它上面的某些面。
投射阴影:由于物体遮挡光线,使场景中位于它后面的物体或区域受不到光照射而形成的。
阴影算法1:阴影体法
Frank Crow 在1997年提出来的,可以在任意的物体上生成阴影。
阴影体法:由一个点光源和一个三角形可以生成一个无限大的阴影体。落在这个阴影体中的物体,就处于阴影中。
阴影算法2:阴影图法
这种算法的主要思想是使用 Z-Buffer 算法,从投射阴影的光源位置对整个场景进行绘制。
这时,对于Z缓冲器的每一个像素,它的Z深度值包括了这个像素到距离光源最近点的物体的距离。一般将Z缓冲器中的整个内容称为阴影图,有时候也称为阴影深度图。
为了使用阴影图,需要对场景进行二次绘制,不过这次是从视点的角度来进行的。
在对每个图元进行绘制的时候,将它们的位置与阴影图进行比较,如果会致电距离光源比阴影图中的数值还要远,那么这个点就在阴影中,否则就不在阴影中。