当光照射到表面时,表面会散射光,将光的一部分反射会环境中。有两个主要的效果用来描述这种反射:反射光的光谱分布和方向分布。光谱分布我们另外会开个专题将,你可以简单理解为颜色。例如想象柠檬表皮被自然光照射的情况。表皮会吸收大部分的蓝光,反射大部分的红光和绿光(这是有柠檬表皮本身的属性决定的)。所以自然光下面柠檬表皮通常是黄色的。无论观察方向在哪里,不同方向的颜色都是黄色的,不同点是表皮可能会出现不同位置的高亮点。再考虑镜子。镜子的反射光和观察方向就有非常大的关系。
半透明表面的反射就更加复杂了。诸如皮肤,树叶,蜡,液体等材质都有一种子表面光传输的特性(subsurface light transport),这种特性使得在某点进入表面的光会在远离改点相当位置的点离开表面。你可以自己试一下用手电筒照射你的嘴巴,看一下你的脸颊的颜色是如何呈现的。
有两种抽象机制可以描述光的反射:BRDF和BSSRDF。BRDF忽略子表面光传输的效果,这种简化在子表面光光传输效果很少的时候可以更有效。BSSRDF则引入这种效果,更加通用复杂但是计算量也更大。酌情使用。
首先,你要时刻记住这是一个函数!这个函数正式地描述了表面的反射。
如上图,我们想要知道由于沿着方向 ω i \omega_i ωi照射表面的辐射亮度 L i ( p , ω i ) L_i(p, \omega_i) Li(p,ωi)引起的沿着 ω 0 \omega_0 ω0方向离开表面的辐射亮度 L 0 ( p , ω o ) L_0(p,\omega_o) L0(p,ωo)。把 ω i \omega_i ωi当成方向的微分圆锥体,p点的微分辐射照度是:
d E ( p , ω i ) = L i ( p , ω i ) c o s θ i d ω i \mathrm{d}E(p,\omega_i)=L_i(p,\omega_i)cos\theta_i\mathrm{d}\omega_i dE(p,ωi)=Li(p,ωi)cosθidωi
在 ω 0 \omega_0 ω0反射的微分辐射亮度将受上面的微分辐射照度的影响。回想第一篇文章我们介绍的集合光学的其中一个假设“线性”,反射的微分辐射亮度正比于上面的辐射照度:
d L o ( p , ω o ) ∝ d E ( p , ω i ) \mathrm{d}L_o(p, \omega_o)\propto\mathrm{d}E(p,\omega_i) dLo(p,ωo)∝dE(p,ωi)
而上面的这个比例关系正是今天介绍的重点之一,BRDF:
f r ( p , ω o , ω i ) = d L o ( p , w o ) d E ( p , ω i ) = d L o ( p , ω o ) L i ( p , ω i ) c o s θ i d ω i f_r(p,\omega_o, \omega_i)=\frac{\mathrm{d}L_o(p, w_o)}{\mathrm{d}E(p,\omega_i)}=\frac{\mathrm{d}L_o(p,\omega_o)}{L_i(p,\omega_i)cos\theta_i\mathrm{d}\omega_i} fr(p,ωo,ωi)=dE(p,ωi)dLo(p,wo)=Li(p,ωi)cosθidωidLo(p,ωo)
我们先停下来自己分析一下BRDF。首先在此强调这是个函数。然后这个函数与几个量有关系: ω i \omega_i ωi, ω o \omega_o ωo, p p p。然后这个函数的输出是一个标量的比值,是输出辐射亮度和输入辐射照度的微分比值。BRDF有两个重要特性:
∫ H 2 ( n ) f r ( p , ω o , ω ′ ) c o s θ ′ d ω ′ ≤ 1 \int_{H^2(\boldsymbol{n})}f_r(p,\omega_o,\omega')cos\theta'\mathrm{d}\omega' \le 1 ∫H2(n)fr(p,ωo,ω′)cosθ′dω′≤1
注意这里为什么是 ≤ 1 \le1 ≤1呢??我们前面说了BRDF是个微分比值函数,每一个具体的函数值代表的是某个点输出方向的微分辐射亮度和输入方向的微分辐射照度的比例。上式将其转变成了微分亮度衡量的输出能量和输入能量的比值,所以必然 ≤ 1 \le1 ≤1
双向透射分布函数(BTDF)可以和BRDF类似定义,不同的是BTDF描述的是透射光的分布。BTDF通常表示为 f t ( p , ω o , ω i ) f_t(p,\omega_o,\omega_i) ft(p,ωo,ωi),因为是投射,所以 ω i \omega_i ωi和 ω o \omega_o ωo是在点p的两个不同半球的。显然,投射不遵循互易性。
为了方便,我们接下来将BRDF和BTDF统一表示成 f ( p , ω o , ω i ) f(p,\omega_o,\omega_i) f(p,ωo,ωi)。我们将这个函数成为双向散射分布函数BSDF。我们之后会详细介绍多种不同的BSDF。我们用BSDF定义来表达离开表面的微分辐射亮度:
d L o ( p , ω o ) = f ( p , ω o , ω i ) L i ( p , ω i ) ∣ c o s θ ∣ d ω i \mathrm{d}L_o(p,\omega_o)=f(p,\omega_o,\omega_i)L_i(p,\omega_i)|cos\theta|\mathrm{d}\omega_i dLo(p,ωo)=f(p,ωo,ωi)Li(p,ωi)∣cosθ∣dωi
对于上面式子需要注意一下几点:
最终我们在p点的所有入射方向进行积分就可以得到p点某个输出方向的辐射亮度:
L o ( p , ω o ) = ∫ S 2 f ( p , ω o , ω i ) L i ( p . ω i ) ∣ c o s θ i ∣ d ω i L_o(p,\omega_o) = \int_{S^2}f(p,\omega_o,\omega_i)L_i(p.\omega_i)|cos\theta_i|\mathrm{d}\omega_i Lo(p,ωo)=∫S2f(p,ωo,ωi)Li(p.ωi)∣cosθi∣dωi
依旧需要注意几个点:
首先BSSRDF也是用来描述散射的。不同于BSDF本身只描述光的反射和透射,BSSRDF加入对子表面光传输的描述。还有一点不同是他的微分比值定义,他是辐射亮度微分和光通量微分的比值(而BSDF是辐射亮度微分和辐射照度微分的比值):
S ( p o , ω o , p i , ω i ) = d L o ( p o , ω o ) d Φ ( p i , ω i ) S(p_o,\omega_o,p_i,\omega_i)=\frac{\mathrm{d}L_o(p_o,\omega_o)}{\mathrm{d}\Phi(p_i,\omega_i)} S(po,ωo,pi,ωi)=dΦ(pi,ωi)dLo(po,ωo)
注意输入多了 p i p_i pi。因为是关于光通量的微分,所以现在输出的辐射亮度需要关于表面积和输入方向双重积分:
L o ( p o , ω o ) = ∫ A ∫ H 2 ( n ) S ( p o , ω o , p i , ω i ) L i ( p i , ω i ) ∣ c o s θ i ∣ d ω i d A L_o(p_o,\omega_o)=\int_A\int_{H^2(n)}S(p_o,\omega_o,p_i,\omega_i)L_i(p_i,\omega_i)|cos\theta_i|\mathrm{d}\omega_i\mathrm{d}A Lo(po,ωo)=∫A∫H2(n)S(po,ωo,pi,ωi)Li(pi,ωi)∣cosθi∣dωidA
当 p o p_o po和 p i p_i pi的距离增大,S的值通常不断减少。表面下的光传输和体积光传输的原则是一样的。我们后面章节会介绍。子表面光传输(子表面散射)和云层或烟雾中的光散射是一样的原理,只不过规模更小而已。