现实世界中的表面绝大多数都是凹凸不平的。在这种情况下,可以把表面看成是大量朝向各异的微小光学平面的集合,我们肉眼可见的每个点都包含了很多个这样的微小光学平面。
光线照射到这些微小表面上时,同样一部分在表面发生反射。这些朝向不同的微表面把入射光线反射到不同的方向。另一部分光线发生折射,折射光线何去何从取决于物质的组成成分。
对于金属,折射进表面的光线的能量会立即被金属中的自由电子吸收,转换成电子的能量,不再可见(下图左边)。对于非金属(电介质或绝缘体),它们往往不是由单一成分构成,而可以认为其中包含了很多折射率不同的微粒,光线遇到这些粒子后发生反射折射,在物质内部不断传播,散射到不同方向,其中一部分会再次穿过表面被观察到,这种现象称为次表面散射(Subsurface Scattering,下图右边穿出表面的蓝色光线),也有一部分在传输过程中被吸收。
根据物质属性和观察尺度的不同,次表面散射会表现出不同的效果。
如下面的左上图,如果光线在物质中传播距离小于观察尺度(绿色区域,可以认为是一个像素区域),我们看到情况如下面的右上图,入射点、反射点、次表面散射的出射点看起来是同一个点。其中反射部分(图中浅棕色出射光)就是我们常说的高光(Specular Light),常聚集在一个方向周围,向这个方向观察该点会看到明显的高光,从其他方向观察该点时高光则比较微弱;次表面散射部分(图中蓝色出射光)是漫射光(Diffuse Light),光线被散射到各个方向。双向反射分布函数BRDF就是用来模拟这种现象的,这也是本文的重点。
如果光线在物质中的传播距离大于观察尺度,如下面的下图,就需要使用次表面散射算法来建模(基于物理着色(四)- 次表面散射)。
MERL等实验室使用仪器测量了上百种真实材质表面在不同光照角度和观察角度下的反射数据,并记录在MERL BRDF Database等数据库中。这些数据由于采集自真实材质,所以使用它渲染出来的结果很真实,但缺点是没有可供调整效果的参数,无法基于这些数据修改成想要的效果,另外部分极端角度由于仪器限制,无法获取到数据,而且采样点密集,数据量非常庞大,所以并不适合游戏等实时领域,一般可用在电影等离线渲染领域,也可以用来做图形学研究,衡量其他模型的真实程度。
经验模型并不是基于物理原理,而是提出经验公式,通过调整参数来模拟光照。
1975年Phong提出Phong反射模型(Phong Reflection Model) :
下标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反射模型:
向量H(半角 Half-Angle)是光线入射向量L和观察向量V的中间向量: h=l+v||l+v||
Blinn-Phong相比Phong,在观察方向趋向平行于表面时,高光形状会拉长,更接近真实情况。
1967年Torrance-Sparrow在Theory for Off-Specular Reflection From Roughened Surfaces中使用辐射度学和微表面理论推导出粗糙表面的高光反射模型,1981年Cook-Torrance在A Reflectance Model for Computer Graphics中把这个模型引入到计算机图形学领域,现在无论是CG电影,还是3D游戏,基于物理着色都是使用的这个模型。我们将在下文中详细分析它的推导过程。
如表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(Bidirectional Reflectance Distribution Function)就是描述表面入射光和反射光关系的。
对于一个方向的入射光,表面会将光反射到表面上半球的各个方向,不同方向反射的比例是不同的,我们用BRDF来表示指定方向的反射光和入射光的比例关系,BRDF定义为:
其中f就是BRDF,l是入射光方向,v是观察方向,也即反射光方向。
dLo(v) 是表面反射到v方向的反射光的微分辐射率。
Lo(v) 为表面反射到v方向的反射光的辐射率,
Lo(v) 来自于表面上半球所有方向的入射光线的贡献,而微分辐射率 dLo(v) 特指方向l的入射光贡献的反射辐射率。
dE(l) 是表面上来自入射光方向l的微分辐照度。
E 为表面接收到的辐照度,
E 来自上半球所有方向的入射光线的贡献,而微分辐照度 dE(l) 特指来自于方向l的入射光。
在图形学中,将BRDF表示为RGB向量,三个分量各有自己的 f 函数。
球坐标系:用两个角度来确定一个方向
1. 方向相对法线的角度 θ ,称为极角(Polar Angle)或天顶角(Zenith Angle)
2. 方向在平面上的投影相对于平面上一个坐标轴的角度 ϕ ,称为方位角(Azimuthal Angle)
BRDF也可以表示成 f(θi,ϕi,θo,ϕo)
下面我们来看看怎么用BRDF来计算表面辐射率。
我们考虑来自方向l的入射光辐射率 Li(l) ,由辐射率和辐照度的定义:
符号 ⊗ 表示按向量的分量相乘,因为 f 和 Li 都包含RGB三个分量。
要计算表面反射到v方向的来自上半球所有方向入射光线贡献的辐射率,可以将上式对半球所有方向的光线积分:
上式称为反射方程(Reflectance Equation),用来计算表面反射辐射率。
对于点光源、方向光等理想化的精准光源(Punctual Light),计算过程可以大大简化。我们考察单个精准光源照射表面,此时表面上的一点只会被来自一个方向的一条光线照射到(而面积光源照射表面时,表面上一点会被来自多个方向的多条光线照射到),则辐射率:
微表面理论(Microfacet Theory)认为我们看到的表面上的一点是由很多朝向各异且光学平的微小表面组成。当光线从l方向照射到这点,而我们在v方向观察时,由于光学平面只会将光线l反射到关于法线对称的v方向,而l和v已经确定,所以只有法线朝向正好是l和v的半角向量h的微表面才会将光线发射到v方向(如下图),从而被我们看见。
用法线分布函数(Normal Distribution Function,简写为NDF)D(h)来描述组成表面一点的所有微表面的法线分布概率,现在可以这样理解:向NDF 输入一个朝向h,输出朝向是h的微表面数占微表面总数的比例。
但实际上并不是所有微表面都能收到接受到光线,如下面左边的图有一部分入射光线被遮挡住,这种现象称为Shadowing。也不是所有反射光线都能到达眼睛,下面中间的图,一部分反射光线被遮挡住了,这种现象称为Masking。光线在微表面之间还会互相反射,如下面右边的图,这可能也是一部分漫射光的来源,在建模高光时忽略掉这部分光线。
Shadowing和Masking用几何衰减因子(Geometrical Attenuation Factor)G(l, v)来建模,输入入射和出射光线方向,输出值表示光线未被遮蔽而能从l反射到v方向的比例。
光学平面并不会将所有光线都反射掉,而是一部分被反射,一部分被折射,反射比例符合菲涅尔方程(Fresnel Equations)F(l, h)。
Torrance-Sparrow基于微表面理论,用上述三个函数建立了高光BRDF模型:
其中n是宏观表面法线,h是微表面法线
我们考察一束光照射到一组微表面上,入射光方向 ωi ,观察方向 ωo ,对反射到 ωo 方向的反射光有贡献的微表面法线为半角向量 ωh ,则这束光的微分通量
dA(ωh) 是法线为半角向量
ωh 的微分微表面面积
dA⊥(ωh) 为 dA(ωh) 在入射光线方向的投影, θh 为入射光线 ωi 和微表面法线 ωh 的夹角
Torrance-Sparrow将微分微表面面积 dA(ωh) 定义为
这里需要特别强调几个夹角:
θh 是入射光线 ωi 与朝向为 ωh 的微表面法线的夹角
θi 是入射光线 ωi 与宏观表面法线的夹角
θo 是反射光线 ωo 与宏观表面法线的夹角
回头看反射方程 Lo(v)=∫Ωf(l,v)⊗Li(l)cosθidωi 是对 dωi 积分,而上式分母包含 dωo ,需要想办法把 dωo 消掉,我估计这也是为什么Torrance-Sparrow在 dA(ωh)=D(ωh)dωhdA 中塞一个 dωh ,:可以通过找到 dωhdωo 的关系,把 dωo 消掉。塞入 dωh 并不会影响方程的合理性,因为 D(ωh) 是可以调整的,现在D( ωh )是一个有单位的量,单位为1/sr。
关于 dωh 和 dωo 关系的推导(在14.5.1节)预设了一个前提: θi=2θh ,可这会导致 θi 和 θh 的定义和前面推导过程中的定义不一致。
如上图,入射光线照射到一个微表面上,与微表面的单位上半球相交于点I,与微表面相交于点O,反射光线与单位上半球相交于点R,反射光束立体角 dωo (图中是 dωr )等于光束与单位上半球相交区域面积 dAr ,法线立体角 dωh (图中是 dω′ )等于法线立体角与单位上半球相交区域面积 dA′ ,因此求 dωhdωo 等价于求 dA′dAr 。
连线 IR 与法线 n′ 相交于点P,则IR = 2IP,由于 dAr 与 dA′′′ 半径的比值等于 IRIP ,而面积为 πr2 ,与半径的平方成正比,所以 dAr=4dA′′′
连线 OQ 长度为1,OP长度为 cosθ′i ,所以 dA′′dA′′′=1cos2θ′i
而 dA′′=dA′cosθ′i
由以上几式可得 dA′dAr=14cosθ′i
需要注意的是,上图中的 θ′i 实际上是微表面的半角 θh ,所以 dωhdωo=14cosθh
因此 fr(ωi,ωo)=Fr(ωo)D(ωh)4cosθocosθi
前面讲到过并非所有朝向为 ωh 的微表面都能接受到光照(Shadowing),也并非所有反射光照都能到达观察者(Masking),考虑几何衰减因子G的影响,则
https://zhuanlan.zhihu.com/p/21376124