计算机图形学基础(三):表面着色(Surface Shading)

所有专栏系列的内容均为本人(b站id:宁牁兒)精心总结和排版,仅用于免费学习交流,任何人不得擅自用于商业活动

前面的章节已经能简单地计算观测光线和相交点了,接下来就是为该相交点着色,用于计算着色的表达式就叫做着色模型,着色模型可以完全独立于渲染系统的其它部分,接下来讨论一个最基本的着色模型,它可以用于点光源照射不透明表面。
类点光源光照(Point-like light sources)
类点光源分为两种:一,点光源,特征是足够小且距离场景比较近,可以被当做一个点来处理,它对场景中的物体有不同的照射;二,方向光源,它也可以被看做是一个点,但是它离场景比较远,所以它几乎对场景的所有物体有着相同的照射,我们不需要知道它的位置而只需要知道它的方向即可。LED灯和太阳光就是这两种光源的典型例子。
点光源光照
点光源通过它的位置(三维空间中的一点)和发光强度来描述,点光源可以在各个方向上的发光强度一样(各向同性的),也可以只在特定的方向上发光(如聚光灯)。
对于各向同性的光源,假设其辐射能量(radiant power)为1瓦特,考虑以其为中心、半径为1的球面,该光源发出的能量全部打在了这个球面上,球面面积为,所以它的辐射能量密度可表示为
,这一密度也叫做辐射照度(irradiance)。
其中,表示光源的光照强度,当
一定时,辐射照度与距离的平方
成反比。

上面的球面是一个特殊情况,光线都是垂直地照向球面(即光线方向和表面法线同向)。大部分情况下,光线和表面法线并不同线,如果将表面转动,此时的照度需要乘上因子
(兰伯特余弦定理),此时:
其中可以叫作对点光源的几何因子,只取决于点光源和接收表面的几何位置关系,
的值可以通过指向光源的光线方向的单位向量
和表面法线方向的单位向量
点乘得到:

方向光源光照
方向光源光照的辐射照度计算几乎和点光源一样,只是光源距离场景太远以至于可以视为一个常量,把它叫做常量
,这个常量就是直射照度。对于方向光源光照,有:
反射模型
照度描述的是有多少光打在物体的表面上,而着色还要考虑到它是如何反射到观测点的。
兰伯特反射
兰伯特反射是一种理想散射,它假设光线同等地反射至所有方向,而不考虑入射光线的方向,所以此时观测点观察到的反射光只和照度相关:
镜面反射
很多材料都会有一些高光,比如金属、光滑的塑料、植物叶子等,当看向这些材料时,反射会随着你的观测位置变化而变化。也就是说,镜面反射依赖于观测点的位置。理想化的镜面反射的入射角和折射角相等,但实际情况是有很多物体表面并不是完全光滑的,这在图形学中被称作光泽反射。
从前面我们知道光泽反射会依赖于表面法线、光照方向
和观测向量
,一种比较简单的光泽反射模型是修正Blinn-Phong模型,这个模型的思想是:当光照方向
和观测向量
关于表面法线
对称时,会表现出最明亮的反射光,并且反射光的强度会随着观测向量
偏离对称位置而平滑下降。

我们使用半程向量来衡量观测向量
偏离对称位置的程度,半程向量指的是观测向量
和光照向量
叠加的一半。当
和
方向相等时,说明观测向量
正好在对称的位置,反射光强度就越大;反之,当
越偏离
,强度就越小。可以通过计算
和
的点积来衡量偏离程度,当两者重合时该点积达到最大值。修正Blinn-Phong模型还给这个值指定了一个指数
确定它下降的快慢程度:
值控制了表面反射的高亮程度,当
越大时,说明反射光强度下降的越快,也就表明了该表面的高亮程度更高。
在知道光源位置和着色点
(即相交点)的情况下,可以计算光源至相交点的距离
和光照向量
的单位向量为
:
半程向量的单位向量容易得到,假设观测向量
的单位向量为
,光照向量
的单位向量为
,则有:
对于兰伯特反射来说,反射光,即
是一个常量,但对光泽反射来说,需要对系数
加上一个高光反射部分:
其中系数叫做镜面系数(specular coefficient),控制着高光的整体明亮程度。
是为了防止
出现负数的情况。此时整体的系数
,这个表达式被叫做双向反射分布函数,它描述了反射光如何随着观测向量
和光照向量
的变化而变化。