4. 表面反射

当光照射到表面时,表面会散射光,将光的一部分反射会环境中。有两个主要的效果用来描述这种反射:反射光的光谱分布和方向分布。光谱分布我们另外会开个专题将,你可以简单理解为颜色。例如想象柠檬表皮被自然光照射的情况。表皮会吸收大部分的蓝光,反射大部分的红光和绿光(这是有柠檬表皮本身的属性决定的)。所以自然光下面柠檬表皮通常是黄色的。无论观察方向在哪里,不同方向的颜色都是黄色的,不同点是表皮可能会出现不同位置的高亮点。再考虑镜子。镜子的反射光和观察方向就有非常大的关系。
半透明表面的反射就更加复杂了。诸如皮肤,树叶,蜡,液体等材质都有一种子表面光传输的特性(subsurface light transport),这种特性使得在某点进入表面的光会在远离改点相当位置的点离开表面。你可以自己试一下用手电筒照射你的嘴巴,看一下你的脸颊的颜色是如何呈现的。
有两种抽象机制可以描述光的反射:BRDF和BSSRDF。BRDF忽略子表面光传输的效果,这种简化在子表面光光传输效果很少的时候可以更有效。BSSRDF则引入这种效果,更加通用复杂但是计算量也更大。酌情使用。

BRDF:双向反射分布函数

首先,你要时刻记住这是一个函数!这个函数正式地描述了表面的反射。
4. 表面反射_第1张图片
如上图,我们想要知道由于沿着方向 ω 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有两个重要特性:

  1. 互易性,对于所有方向 ω i \omega_i ωi ω o \omega_o ωo f r ( p , ω i , ω o ) = f r ( p , ω o , ω i ) f_r(p,\omega_i,\omega_o)=f_r(p,\omega_o,\omega_i) fr(p,ωi,ωo)=fr(p,ωo,ωi)
  2. 能量守恒。整体的反射光的能量不大于输入光的整体能量。对于所有方向 ω o \omega_o ωo

    ∫ 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

对于上面式子需要注意一下几点:

  1. BRDF和BTDF虽然形式类似,但是他们的光学原理完全不一样,所以整合到一起不会引起冲突
  2. 上面式子输出的微分辐射亮度和输入方向无关。这就很奇怪了,这实际上关系到如何理解微分辐射亮度。我们知道辐射亮度描述的是单位立体角单位面积的功率,也就是辐射亮度本身已经包含了微分的概念了,那么对于辐射亮度再求微分代表了什么呢?

最终我们在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θidωi

依旧需要注意几个点:

  1. 左边求的是某个点在某个出射方向的辐射亮度,和输入方向无关
  2. 右边是对于某个点p所有入射方向的辐射亮度和BSDF积分。注意的是这里的辐射亮度和输出方向无关,而BSDF将输入方向和输出方向结合了起来。
  3. 上式是渲染中的一个基本式子,描述了一个点的入射光的分布如何根据表面的散射属性变化到出射光的分布。如果你经过自己的充分思考,那么到这一步你就应该知道了实际上BSDF是和表面的属性相关的。
  4. 当积分角度为整个球体 S S S的时候,他叫做“散射方程”。当积分角度是半球 H H H的时候,他就是大名鼎鼎的“渲染方程”

BSSRDF:双向散射表面反射分布函数

首先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)=AH2(n)S(po,ωo,pi,ωi)Li(pi,ωi)cosθidωidA

p o p_o po p i p_i pi的距离增大,S的值通常不断减少。表面下的光传输和体积光传输的原则是一样的。我们后面章节会介绍。子表面光传输(子表面散射)和云层或烟雾中的光散射是一样的原理,只不过规模更小而已。

你可能感兴趣的:(渲染技术)