Surface Model and Rendering Equation
Surface Model
当光照射到表面时,表面会散射光线,并将其中一部分反射回环境中,这种反射有两个主要的效应:反射光的光谱分布和它的方向分布。
光谱分布决定了哪些颜色的光会被表面吸收,例如柠檬表皮主要吸收蓝色波长的光,因此在白光照射下,无论从哪个方向看颜色都是偏黄的;而方向分布决定了表面会向那些方向反射光,例如镜子中一点反射出来的光几乎完全取决于观察方向,在镜子上的一个固定点,随着视角的变化,反射到镜子中的物体也随之变化。
半透明表面的反射则更为复杂,因为我们还需要考虑光线散射到次表面,再由次表面反射回来的光。
有两个模型都用于描述光的反射机制:BRDF 和 BSSRDF。BRDF 忽略次表面的光传输,使渲染算法的实现更加高效;相反的,BSSRDF 能够用于模拟更多的半透明材质,但是开销更大。
The BRDF and the BTDF
双向反射分布函数(Bidirectional reflection distribution function,BRDF)提供了一种描述表面反射的形式,如下图所示,我们关心有多少 radiance
L
i
(
p
,
ω
i
)
L_i(p,\omega_i)
Li(p,ωi)从光线入射方向
ω
i
\omega_i
ωi进入点 p,又有多少 radiance
L
o
(
p
,
ω
o
)
L_o(p,\omega_o)
Lo(p,ωo)从方向
ω
o
\omega_o
ωo离开了 p 点,照射到了观察者眼中。
如果考虑微分立体角
d
ω
i
\mathrm{d}\omega_i
dωi上射来的 radiance,则可以将这个立体角带来的微分 irradiance 写作:
d E ( p , ω i ) = L i ( p , ω i ) cos θ i d ω i \begin{equation} \mathrm{d}E(p,\omega_i)=L_i(p,\omega_i)\cos\theta_i\,\mathrm{d}\omega_i \end{equation} dE(p,ωi)=Li(p,ωi)cosθidωi
这个微分 irradiance 将引起反射到 ω o \omega_o ωo方向上的 radiance 的微小改变,基于几何光学的线性假设,反射的微分 radiance 与获得的微分 irradiance 成正比: 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)
随后,我们就可以将这个比例系数定义为是这个表面 p 点的 BRDF f r f_r fr,有:
f r ( p , ω o , ω i ) = d L o ( p , ω o ) d E ( p , ω i ) = d L o ( p , ω o ) L i ( p , ω i ) cos θ i d ω i \begin{equation} f_r(p,\omega_o,\omega_i)=\frac{\mathrm{d}L_o(p, \omega_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} \end{equation} fr(p,ωo,ωi)=dE(p,ωi)dLo(p,ωo)=Li(p,ωi)cosθidωidLo(p,ωo)
由于 f r ( p , ω i , ω o ) f_r(p,\omega_i,\omega_o) fr(p,ωi,ωo)是一个关于入射角和出射角的函数,因此在每一个点上,它都是一个四维的函数( ω \omega ω需要使用 θ \theta θ和 ϕ \phi ϕ两个值表示)
基于物理的 BRDF 有两个重要性质:
- 交换性(Reciprocity):对于任意 ω 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)
- 能量守恒(Energy conservation):反射光的总能量小于或等于入射光的能量。对于所有 ω o \omega_o ωo都有, ∫ H 2 ( n ) f r ( p , ω o , ω ′ ) cos θ ′ d ω ′ ≤ 1 \int_{H^2(\bold{n})}f_r(p,\omega_o,\omega')\cos\theta'\,\mathrm{d}\omega'\leq1 ∫H2(n)fr(p,ωo,ω′)cosθ′dω′≤1
关于 BRDF 有两个有用的量。
第一,半球定向反射率(hemispherical-directional reflectance),用 ρ h d ( ω o ) \rho_{hd}(\omega_o) ρhd(ωo)表示,它是一个关于出射方向的二维函数,它表示了出射方向$\omega_o $在各个方向的 radiance 都为一个常数的情况下的反射率总量,写作:
ρ h d ( ω o ) = ∫ H 2 ( n ) f r ( p , ω o , ω i ) ∣ cos θ i ∣ d ω i \begin{equation} \rho_{hd}(\omega_o)= \int_{H^2(\bold{n})}f_r(p,\omega_o,\omega_i)|\cos\theta_i|\,\mathrm{d}\omega_i \end{equation} ρhd(ωo)=∫H2(n)fr(p,ωo,ωi)∣cosθi∣dωi
第二,半球面-半球面反射率(hemispherical-hemispherical reflectance),用 ρ h h \rho_{hh} ρhh表示,它表示当所有方向的 radiance 相同时,表面对光线的反射率(对应被吸收的部分),写作:
ρ h h = 1 π ∫ H 2 ( n ) ∫ H 2 ( n ) f r ( p , ω o , ω i ) ∣ cos θ o cos θ i ∣ d ω o d ω i \begin{equation} \rho_{hh}=\frac1\pi\int_{H^2(\bold{n})}\int_{H^2(\bold{n})} f_r(p,\omega_o,\omega_i)|\cos\theta_o\cos\theta_i|\,\mathrm{d}\omega_o\,\mathrm{d}\omega_i \end{equation} ρhh=π1∫H2(n)∫H2(n)fr(p,ωo,ωi)∣cosθocosθi∣dωodωi
而一个表面的双向透射率分布函数(bidirectional transmittance distribution function, BTDF)则描述了透射光的分布,它可以用 BRDF 类似的方法定义,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 两个不同的半球上,值得注意的是,BTDF 不满足交换性。
The BSDF
当我们同时考虑 BRDF 和 BTDF 时,我们可以将其写作 f ( p , ω o , ω i ) f(p,\omega_o,\omega_i) f(p,ωo,ωi),这个函数被称为双向散射分布函数(bidirectional scattering distribution function, BSDF),使用 BSDF 的概念,我们可以得到:
d L o ( p , ω o ) = f ( p , ω o , ω i ) L i ( p , ω i ) ∣ cos θ i ∣ d ω i \begin{equation}\mathrm{d}L_o(p, \omega_o)= f(p,\omega_o,\omega_i) L_i(p, \omega_i) |\cos\theta_i| \,\mathrm{d}\omega_i \end{equation} dLo(p,ωo)=f(p,ωo,ωi)Li(p,ωi)∣cosθi∣dωi
由此,我们可以在入射方向的球面上对这个方程进行积分,计算出由于来自各个方向的入射 radiacne 带来的出射 radiance:
L o ( p , ω o ) = ∫ S 2 f ( p , ω o , ω i ) L i ( p , ω i ) ∣ cos θ i ∣ d ω i \begin{equation} 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 \end{equation} Lo(p,ωo)=∫S2f(p,ωo,ωi)Li(p,ωi)∣cosθi∣dωi
这是渲染中的一个基本等式,它描述了基于表面的散射特性,光在一点上的入射分布如何转化为出射分布,它被称为 scattering equation,对应的仅积分半球 BRDF 的方程被称为 reflection equation。
The BSSRDF
双向散射表面反射分布函数(bidirectional scattering surface reflectance distribution function, BSSRDF)用于描述具有次表面光传输的材料,写作 S ( p o , ω o , p i , ω i ) S(p_o,\omega_o,p_i,\omega_i) S(po,ωo,pi,ωi),它表示的是出射点 p o p_o po向出射方向 ω o \omega_o ωo的微分 radiance 与入射点$p_i 从入射方向 从入射方向 从入射方向\omega_i$得到的微分 flux 之间的比值:
S ( p o , ω o , p i , ω i ) = d L o ( p o , ω o ) d Φ ( p i , ω i ) \begin{equation} 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)} \end{equation} S(po,ωo,pi,ωi)=dΦ(pi,ωi)dLo(po,ωo)
如下图所示,BSSRDF 是对 BSDF 的更一般表示,它在 BSDF 的基础上还考虑了对出射点周围的所有点进行积分。
BSSRDF 的渲染方程如下:
L o ( p , ω o ) = ∫ A ∫ H 2 ( n ) S ( p o , ω o , p i , ω i ) L i ( p i , ω i ) ∣ cos θ i ∣ d ω i d A \begin{equation} L_o(p,\omega_o)=\int_A\int_{{H^2(\bold{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 \end{equation} Lo(p,ωo)=∫A∫H2(n)S(po,ωo,pi,ωi)Li(pi,ωi)∣cosθi∣dωidA
BSSRDF 的渲染方程相比 BSDF 的更加复杂,值得注意的是 BSSRDF 只需积分表面半球而不是整个球面。
表面下的光传输与参与介质中的体积光传输的原理相同。
Radiometric Integrals(辐射积分)
在 BRDF 中,我们看到要对 radiance(或 irradiance)进行积分运算,这其中存在一些技巧,可以让我们更方便的计算这些积分。
假如我们需要计算一个表面上点 p 的 irradiance,可以将其表示为积分形式:
E ( p , n ) = ∫ Ω L i ( p , ω ) ∣ cos θ ∣ d ω \begin{equation} E(p,\bold{n})=\int_{\Omega}L_i(p, \omega)|\cos\theta|{}\,\mathrm{d}\omega \end{equation} E(p,n)=∫ΩLi(p,ω)∣cosθ∣dω
其中
L
i
(
p
,
ω
)
L_i(p, \omega)
Li(p,ω)是入射的radiance函数,
cos
θ
\cos\theta
cosθ是为了描述
d
A
⊥
\mathrm{d}A^\perp
dA⊥存在的,
θ
\theta
θ是
ω
\omega
ω和
n
\bold{n}
n的夹角,irradiance的积分限一般是
n
\bold{n}
n 对应的单位半球上的立体角方向。
Integrals over Projected Solid Angle(投影立体角积分)
有时,为了避免积分中的余弦因子,我们还会将立体角投影到其对应的单位圆盘上,从而积分投影的立体角,它们之间的关系有 d ω ⊥ = ∣ cos θ ∣ d ω \mathrm{d}\omega^{\perp}=|\cos\theta|\mathrm{d}\omega dω⊥=∣cosθ∣dω,因此可以将 irradiance 的积分写作:
E ( p , n ) = ∫ H 2 ( n ) L i ( p , ω ) d ω ⊥ \begin{equation} E(p,\bold{n})=\int_{H^2(\bold{n})}L_i(p, \omega){}\,\mathrm{d}\omega^{\perp} \end{equation} E(p,n)=∫H2(n)Li(p,ω)dω⊥
如下图所示:
Integrals over Spherical Coordinates(球坐标积分)
为求得立体角上的积分,我们通常会用球坐标的极角和方位角 ( θ , ϕ ) (\theta,\phi) (θ,ϕ)来表示立体角,为实现这一点,我们先找到微分立体角和微分球坐标的关系 d ω = sin θ d θ d ϕ \mathrm{d}\omega=\sin\theta\,\mathrm{d}\theta\,\mathrm{d}\phi dω=sinθdθdϕ。
由此可以将 irradiance 的积分写作:
E ( p , n ) = ∫ 0 2 π ∫ 0 π / 2 L i ( p , θ , ϕ ) cos θ sin θ d θ d ϕ \begin{equation} E(p,\bold{n})=\int_{0}^{2\pi}\int_{0}^{\pi/2} L_i(p,\theta,\phi)\cos\theta\sin\theta{}\,\mathrm{d}\theta\,\mathrm{d}\phi \end{equation} E(p,n)=∫02π∫0π/2Li(p,θ,ϕ)cosθsinθdθdϕ
如下图所示:
当各个方向 radiance 都相同时,有
E
=
π
L
i
E=\pi{}L_i
E=πLi
Integrals over Area
最后一个有用的变换是把方向积分变成面积积分,假设我们在考虑 irradiance 的积分时,明确知道光源来自于某一片区域 A A A(也许是一个四边形区域),同时知道光源发出的 radiance,这时若我们仍通过立体角 ω \omega ω进行积分,很有可能一大片区域的立体角 ω \omega ω都无法打到光源,使用蒙特卡洛积分采样 ω \omega ω会使效率非常低,这让我们想到了可以对光源进行采样,由此,我们需要建立对区域 A A A的积分公式。
在如下图所示的情况下,我们可以计算出微分立体角与微分区域面积之间的关系为:
d
ω
=
d
A
cos
θ
r
2
\mathrm{d}\omega=\frac{\mathrm{d}A\cos\theta}{r^2}
dω=r2dAcosθ。
由此将原积分问题写作:
E ( p , n ) = ∫ A L cos θ i cos θ o d A r 2 \begin{equation} E(p,\bold{n})=\int_{A}L\cos\theta_i\frac{\cos\theta_o\,\mathrm{d}A}{r^2} \end{equation} E(p,n)=∫ALcosθir2cosθodA
其中, θ i \theta_i θi是方位角与 p 点法线的夹角, θ o \theta_o θo是方位角与区域 A A A法线的夹角。
此外,如果光源是不规则形状的,我们则可以积分包含光源的一整块区域
A
A
A,如下图所示。
这种方式就是闫令琪老师在Games101中讲Path tracing时使用的积分转换
Rendering Equation(渲染方程)
Basic Form
Rendering Equation 依赖于我们在选择使用 radiometry 来描述光时所做的基本假设(线性,无偏振,能量守恒等),并且场景中的辐射分布处于平衡状态,在宏观上,我们有能量守恒定理 Φ o − Φ i = Φ e − Φ a \Phi_o-\Phi_i=\Phi_e-\Phi_a Φo−Φi=Φe−Φa。
假设表面的出射 radiance 为 L o L_o Lo,那么它一定等于表面自己发射的 radiance 和散射的 radiance 的总和,使用 scattering equation 下,rendering equation 为:
L o ( p , ω o ) = L e ( p , ω o ) + ∫ S 2 f ( p , ω o , ω i ) L i ( p , ω i ) ∣ cos θ i ∣ d ω i \begin{equation} L_o(p,\omega_o)=L_e(p,\omega_o)+\int_{S^2}f(p,\omega_o,\omega_i)L_i(p,\omega_i)|\cos\theta_i|\,\mathrm{d}\omega_i \end{equation} Lo(p,ωo)=Le(p,ωo)+∫S2f(p,ωo,ωi)Li(p,ωi)∣cosθi∣dωi
此公式最早由 Kajiya 提出,因此也被称为 Kajiya Rendering Equation,有时在其他材料中,渲染方程也会被称为光传输方程(Light Transport Equation, LTE)。
若我们考虑几何体之间没有介质(media),那积分中的
L
i
(
p
,
ω
i
)
L_i(p,\omega_i)
Li(p,ωi)一定是某个点
p
′
p'
p′的出射 radiance,如下图所示。设 ray-casting function 为
p
′
=
t
(
p
,
ω
)
p'=t(p,\omega)
p′=t(p,ω),我们即可把入射 radiance 写作出射 radiance 形式
L
i
(
p
,
ω
i
)
=
L
o
(
t
(
p
,
ω
)
,
−
ω
)
L_i(p,\omega_i)=L_o(t(p,\omega),-\omega)
Li(p,ωi)=Lo(t(p,ω),−ω)
Lambertian 材质的 BRDF
Lambertian 材质,即常说的漫反射材质,打到它表面的光线会均匀分布在法线所对应的半球上,因此它的 BRDF 是一个常数, f r = ρ π f_r=\frac{\rho}{\pi} fr=πρ。其中, ρ \rho ρ是漫反射系数,一维情况下,它的取值范围是 0 到 1,1 代表此材质不会导致颜色衰减,能反射所有能量,0 代表此材质将所有颜色全部吸收,不反射任何光线。若定义了一个漫反射物体的颜色,那这个颜色就是它的漫反射系数 ρ \rho ρ。
推导
Lambertian 材质的 BRDF 处处相等,因此可以设 f r = c f_r=c fr=c,由于表面反照率为 ρ \rho ρ,因此 ∫ f r cos ω i d ω i = ρ \int{f_r}\cos\omega_i\,\mathrm{d}\omega_i=\rho ∫frcosωidωi=ρ,设极角为 θ \theta θ,方位角为 ϕ \phi ϕ,改写成极坐标形式 ∫ 0 2 π ∫ 0 π 2 c ⋅ sin θ d θ d ϕ = ρ \int^{2\pi}_0\int^{\frac{\pi}2}_0c\cdot{\sin\theta}\,\mathrm{d}\theta\,\mathrm{d}\phi=\rho ∫02π∫02πc⋅sinθdθdϕ=ρ,由此算得 f r = c = ρ π f_r=c=\frac\rho\pi fr=c=πρ。
实时渲染中的 Rendering Equation
而在实时渲染中,一般会将渲染方程进行改写,一般考虑实时渲染 RTR 下的渲染方程如下:
L o ( p , ω o ) = ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) cos θ i V ( p , ω i ) d ω i L_o(p,\omega_o)=\int_{\Omega^+}L_i(p,\omega_i)f_r(p,\omega_i,\omega_o)\cos\theta_iV(p,\omega_i)d\omega_i Lo(p,ωo)=∫Ω+Li(p,ωi)fr(p,ωi,ωo)cosθiV(p,ωi)dωi
其中不同点在于,渲染方程单独考虑 V ( p , ω i ) V(p,\omega_i) V(p,ωi)Visibility 项,而且通常会将 f r ( p , ω i , ω o ) cos θ i f_r(p,\omega_i,\omega_o)\cos\theta_i fr(p,ωi,ωo)cosθi项合并看做 BRDF。
The Surface Form
除了立体角形式,rendering equation 也可以写作对表面进行积分的形式,考虑空间中三个点
p
,
p
′
,
p
′
′
p,p',p''
p,p′,p′′,如下图所示。
p
′
p'
p′点的 BSDF 可以写作
f
(
p
′
′
→
p
′
→
p
)
=
f
(
p
′
,
ω
o
,
ω
i
)
f(p''\to{}p'\to{p})=f(p',\omega_o,\omega_i)
f(p′′→p′→p)=f(p′,ωo,ωi),其中
ω
i
=
p
′
′
−
p
′
^
\omega_i=\widehat{p''-p' }
ωi=p′′−p′
,
ω
o
=
p
−
p
′
^
\omega_o=\widehat{p-p'}
ωo=p−p′
,这有时被称为 BSDF 的三点形式(three point form)。
使用上文Interals over Area的知识,可以知道微分区域面积之间的关系为: d ω = d A cos θ r 2 \mathrm{d}\omega=\frac{\mathrm{d}A\cos\theta}{r^2} dω=r2dAcosθ。将这个变换项和一个可见性函数 V V V组合起来,即可得到一个单一的集合耦合项(geometric coupling term) G ( p ↔ p ′ ) G(p\leftrightarrow{p'}) G(p↔p′):
G ( p ↔ p ′ ) = V ( p ↔ p ′ ) ∣ cos θ ∣ ∣ cos θ ′ ∣ ∣ ∣ p − p ′ ∣ ∣ 2 \begin{equation} G(p\leftrightarrow{p'})=V(p\leftrightarrow{p'})\frac{|\cos\theta||\cos\theta'|}{||p-p'||^2} \end{equation} G(p↔p′)=V(p↔p′)∣∣p−p′∣∣2∣cosθ∣∣cosθ′∣
代入原方程可以得到表面形式的渲染方程:
L ( p ′ → p ) = L e ( p ′ → p ) + ∫ A f ( p ′ ′ → p ′ → p ) L ( p ′ ′ → p ′ ) G ( p ′ ′ ↔ p ′ ) d A ( p ′ ′ ) \begin{equation} L(p'\to{p})=L_e(p'\to{p})+\int_{A}f(p''\to{}p'\to{p})L(p''\to{p'})G(p''\leftrightarrow{p'})\,\mathrm{d}A(p'') \end{equation} L(p′→p)=Le(p′→p)+∫Af(p′′→p′→p)L(p′′→p′)G(p′′↔p′)dA(p′′)
PS
本文主要是对PBRT内容的翻译总结,欢迎交流学习~