前言
现实世界中的表面绝大多数都是凹凸不平的。在这种情况下,可以把表面看成是大量朝向各异的微小光学平面的集合,我们肉眼可见的每个点都包含了很多个这样的微小光学平面。
光线照射到这些微小表面上时,同样一部分在表面发生反射。这些朝向不同的微表面把入射光线反射到不同的方向。另一部分光线发生折射,折射光线何去何从取决于物质的组成成分。
对于金属,折射进表面的光线的能量会立即被金属中的自由电子吸收,转换成电子的能量,不再可见(下图左边)。对于非金属(电介质或绝缘体),它们往往不是由单一成分构成,而可以认为其中包含了很多折射率不同的微粒,光线遇到这些粒子后发生反射折射,在物质内部不断传播,散射到不同方向,其中一部分会再次穿过表面被观察到,这种现象称为次表面散射(Subsurface Scattering,下图右边穿出表面的蓝色光线),也有一部分在传输过程中被吸收。
根据物质属性和观察尺度的不同,次表面散射会表现出不同的效果。
如下面的左上图,如果光线在物质中传播距离小于观察尺度(绿色区域,可以认为是一个像素区域),我们看到情况如下面的右上图,入射点、反射点、次表面散射的出射点看起来是同一个点。其中反射部分(图中浅棕色出射光)就是我们常说的高光(Specular Light),常聚集在一个方向周围,向这个方向观察该点会看到明显的高光,从其他方向观察该点时高光则比较微弱;次表面散射部分(图中蓝色出射光)是漫射光(Diffuse Light),光线被散射到各个方向。双向反射分布函数BRDF就是用来模拟这种现象的,这也是本文的重点。
如果光线在物质中的传播距离大于观察尺度,如下面的下图,就需要使用次表面散射算法来建模(基于物理着色(四)- 次表面散射)。
光照模型
1. 测量模型
MERL等实验室使用仪器测量了上百种真实材质表面在不同光照角度和观察角度下的反射数据,并记录在MERL BRDF Database等数据库中。这些数据由于采集自真实材质,所以使用它渲染出来的结果很真实,但缺点是没有可供调整效果的参数,无法基于这些数据修改成想要的效果,另外部分极端角度由于仪器限制,无法获取到数据,而且采样点密集,数据量非常庞大,所以并不适合游戏等实时领域,一般可用在电影等离线渲染领域,也可以用来做图形学研究,衡量其他模型的真实程度。
2. 经验模型
经验模型并不是基于物理原理,而是提出经验公式,通过调整参数来模拟光照。
1975年Phong提出Phong反射模型(Phong Reflection Model) :
IPong=kaIa+kd(n⋅l)Id+ks(r⋅v)αIs
下标a表示环境光(Ambient Light);
下标d表示漫射光(Diffuse Light);
下标s表示高光(Specular Light);
k表示反射系数或者材质颜色,I表示光的颜色或者亮度;
α 可以模拟表面粗糙程度,值越小越粗糙,越大越光滑。
反射向量r根据光线入射向量l相对法线n做反射得到: r=2(n⋅l)n−l
1977年Blinn对Phong模型做出修改,这就是后来广泛使用的Blinn-Phong反射模型:
IBlinn−Phong=kaIa+kd(n⋅l)Id+ks(n⋅h)αIs
向量H(半角 Half-Angle)是光线入射向量L和观察向量V的中间向量: h=l+v||l+v||
Blinn-Phong相比Phong,在观察方向趋向平行于表面时,高光形状会拉长,更接近真实情况。
3.基于物理的分析模型
1967年Torrance-Sparrow在Theory for Off-Specular Reflection From Roughened Surfaces中使用辐射度学和微表面理论推导出粗糙表面的高光反射模型,1981年Cook-Torrance在A Reflectance Model for Computer Graphics中把这个模型引入到计算机图形学领域,现在无论是CG电影,还是3D游戏,基于物理着色都是使用的这个模型。我们将在下文中详细分析它的推导过程。
辐射度学基本量
如表1所示列出了各个辐射度学的物理量
表 1: 辐射度量学中的基本度量,这些度量也成为光照⽅程的基本度量。
名称 |
符号 |
表达式 |
含义 |
辐射能量(radiant energy) |
Q
|
hcλ
|
电磁波的能量 |
辐射通量(radiant flux)/功率(power) |
Φ
|
dQdt
|
单位时间内通过表面或者空间区域的能量的总量 |
辐射照度(irradiance) |
E
|
dΦdA
|
到达表面的通量密度 |
辐射出度(Radiant Existance) |
M
|
dΦdA
|
离开表面的通量密度 |
辐射强度(radiant intensity) |
I
|
dΦdω
|
通过单位立体角的辐射通量 |
辐射亮度(radiance)/辐射率 |
L
|
dΦdωdA⊥
|
每单位面积每单位立体角的辐射通量密度 |
点光源向四周辐射能量,假想以点光源为中心不同半径的球包围着点光源,穿过这些球的辐射通量是相同的,均为 Φ ,而球的表面积为 4πr2 ,可得通量密度 E=Φ4πr2 ,也就是说通量密度与距离的平方成反比,离光源越远,通量密度越低,这也是为什么光的衰减与距离的平方成正比。
立体角是度量三维角度的量,用符号 ω 表示,单位为立体弧度(也叫球面度,Steradian,简写为sr),等于立体角在单位球上对应的区域的面积(实际上也就是在任意半径的球上的面积除以半径的平方 ω=sr2 ),单位球的表面积是 4π ,所以整个球面的立体角也是 4π 。
BRDF
双向反射分布函数BRDF(Bidirectional Reflectance Distribution Function)就是描述表面入射光和反射光关系的。
对于一个方向的入射光,表面会将光反射到表面上半球的各个方向,不同方向反射的比例是不同的,我们用BRDF来表示指定方向的反射光和入射光的比例关系,BRDF定义为:
f(l,v)=dLo(v)dE(l)
其中f就是BRDF,l是入射光方向,v是观察方向,也即反射光方向。
dLo(v) 是表面反射到v方向的反射光的微分辐射率。
Lo(v) 为表面反射到v方向的反射光的辐射率,
Lo(v) 来自于表面上半球所有方向的入射光线的贡献,而微分辐射率 dLo(v) 特指方向l的入射光贡献的反射辐射率。
dE(l) 是表面上来自入射光方向l的微分辐照度。
E 为表面接收到的辐照度,
E