0%

《全局光照》读书笔记(三)

《全局光照》第一章基于物理的渲染和渲染方程总结

双向反射分布函数

双向反射分布函数(bidirectional reflectance distribution function,BRDF)用来表示物体表面的反射,表示反射方向上的辐射亮度增量与入射方向辐射照度增量的比率:
$$
f_r(\omega_i,\omega_r)=\frac{dL_r(\omega_r)}{dE_i(\omega_i)}=\frac{dL_r(\omega_r)}{L_i(\omega_i)cos\theta_id\omega_i}
$$
其中,$\omega_i$为入射方向,$\omega_r$为反射方向,$\theta_i$为入射光与表面法线的夹角。又由方向可以用一个方位角$\phi$和一个顶点角$\theta$表示,因此整个BRDF函数具有4个变量。BRDF函数的单位为$sr^{-1}$,直观上来讲BRDF表示入射光方向单位立体角的能量在反射方向上的反射比率。

给定BRDF函数便可求出该点处沿观察方向的辐射亮度,即反射方程(reflectance equation):
$$
L_r(\omega_r) = \int_\Omega f(\omega_i,\omega_r)\otimes L_i(\omega_i)cos\theta_id\omega_i
$$
$\otimes$指按RGB分量相乘。

BRDF性质

第一,赫姆霍兹互反律,BRDF的入射方向和出射方向可以互相对换,即:
$$
f_r(\omega_i,\omega_r) = f_i(\omega_r,\omega_i)
$$
第二,能量守恒定律,即所有的反射能量不能大于所有的吸收能量,可表示为:
$$
\int_\Omega f_r(\omega_i,\omega_r)cos\theta_id\omega_i\le1,\forall\omega_r
$$
但在实时渲染中,这两条定律并不是绝对遵守。

菲涅耳公式

菲涅耳方程(Fresnel equation)描述的是光由一种介质进入另一种介质时在光滑表面上反射与折射的比率。菲涅耳公式仅取决于入射角$\theta$和两种介质的折射系数,通常用$R_F$表示菲涅耳反射率。根据能量守恒定律,折射的能量比率为$1-R_F$,然而由于折射的立体角大小有所改变,辐射亮度的折射率并不是$1-R_F$。

设入射辐射亮度为$L_1$定义的辐射通量为$\Phi_1(\theta_1,\phi_1)$穿过无限小立体角$d\omega_1=sin\theta_1d\theta_1d\phi_1$照射到面积为$ds$大小的区域能量为:
$$
L_1 = \frac{d\Phi_1}{cos\theta_1sin\theta_1d\theta_1d\phi_1ds}
$$
设$\theta_2$为折射方向,对折射公式求微分得:
$$
n_1cos\theta_1d\theta_1=n_2cos\theta_2d\theta_2
$$
折射方向的顶点角$\theta$虽然发生了变化但方位角$\phi$与入射角是相同的,故用折射定律的等式乘以上式得:
$$
n_1^2dscos\theta_1sin\theta_1d\theta_1d\phi_1 = n_2^2dscos\theta_2sin\theta_2d\theta_2d\phi_2
$$
设几何范围为$dG=dscos\theta sin\theta d\theta d\phi$,可见入射光体积范围与折射光体积范围满足:
$$
n_1^2dG_1 = n_2^2dG_2
$$
所以折射后的辐射亮度为:
$$
L_2=(1-R_F(\theta_1))\frac{n_2^2}{n_1^1}L_1
$$
通常菲涅耳公式$R_F(\theta)$的曲线非常复杂,在渲染领域通常不会使用原始的菲涅耳公式。以下为一个简单且相对比较精确的近似方程:
$$
R_F(\theta_i)\approx R_F(0°)+(1-R_F(0°))(1-\bar{cos}\theta_i)^5
$$
其中$R_F(0°)$表示入射光垂直于表面时菲涅尔反射率的值,这个值可以在现实生活中采样到也可以通过材质折射率得出:
$$
R_F(0°)=(\frac{n_1-n_2}{n_1+n_2})^2
$$

微面元理论

基础

微面元理论假设所有物体表面由大量微观几何结构的微面元(microfacet)组成,每个面元是绝对光滑的。这些面元的法线方向由一个统计的法线分布函数(normal distribution normals,NDF)给出,这个分布函数反应光从每个方向反射的概率。只有那些满足反射方向刚好在观察方向$v$的面元才能被看到,意味着这些可以被观察到的面元的法线正好位于入射方向$l$和观察方向$v$的中间,这个矢量称为半矢量$h=\frac{l+v}{|l+v|}$。并不是所有法线在半矢量$h$方向的面元都会被观察到,其中一些会在光源方向或观察方向上被其他面元阻挡。

综上,基于微面元理论的BRDF模型主要由两部分因素决定:

  • 一个关于表面法线分布函数D
  • 一个表示几何遮挡关系的函数G

对于各向同性(isotropic)材质的BRDF模型由以下式给出:
$$
f(l,v)=f_d+\frac{R_F(\theta_h)G(\theta_l,\theta_v)D(\theta_h)}{4cos\theta_lcos\theta_v}
$$
这个模型包括漫反射部分和光泽部分,其中漫反射部分通常与方向无关为一个常数$f_d$。光泽部分包含3个组件:菲涅耳反射率$R_F$,几何遮挡关系$G$,微表面法线分布函数$D$。$\theta_l$与$\theta_v$表示入射方向和观察方向与表面法线的夹角,$\theta_h$是表面法线和半矢量之间的夹角,$\theta_d$是入射方向和半矢量之间的差值。

微观面元法线分布函数D

根据概率的特征,D通常在其作用域归一化为1,即:
$$
\int_\Omega D(\theta_h)cos\theta_h dw=1
$$
法线分布函数是由表面粗糙度决定,用roughness表示这个粗糙度参数。一般关于光泽BRDF球状分布,它具有一个很长的拖尾。这个拖尾在画面中表现为高光点边缘有一定的模糊的感觉。为了表示这个拖尾,迪斯尼发现GGX分布具有最长的拖尾,它的分布函数为:
$$
D_{TR}=c/(\alpha^2cos^2\theta_h+sin^2\theta_h)^2
$$
后面又出现了一个指数变化的更一般化的分布函数:
$$
D_{DTR}=c/(\alpha^2cos^2\theta_h+sin^2\theta_h)^\lambda
$$

其中,$c$表示一个缩放常数,$\alpha$表示表面的粗糙度介于0到1之间。$\alpha$等于0时表示一个绝对光滑的表面,等于1时表示一个绝对粗糙的表面。

为了精确描述物体的真实光泽性质,于是对同一个表面使用多个光泽叶(光泽叶指的光泽反射的分布可视化后叶状部分)。但一般同时使用2个Specular lobe。所以迪士尼采用了两个GGX的组合来表述。其中一个GTR的$\lambda=2$它表示中心的高亮度区域,并且它用来表述金属材质的各向异性;第二个GTR的$\lambda=1$表示拖尾部分,具有更低的亮度,它仅表示各向同性的光照。

对于粗糙度迪士尼用$\alpha=roughness^2$以产生一个更线性的变化。对于各向异性(anisotropic)的法线分布函数,粗糙度将随着方位角$\phi$变化,所以$\frac{1}{\alpha^2}$可以被$\frac{cos^2\phi}{\alpha_x^2}+\frac{sin^2\phi}{\alpha_y^2}$替换,其中:
$$
aspect = \sqrt{1-0.9anisotropic} \
\alpha_x=roughness^2/aspect\
\alpha_y=roughness^2aspect
$$
这里的roughness和anisotropic均为材质参数。

微观面元几何遮挡函数G

G描述的是那些具有半矢量法线的微观面元中,有多少是同时被入射方向和反射方向看见的,因此G的一个特征是其值介于0和1之间:
$$
0\le G(\theta_l,\theta_v)\le1
$$
G通常依赖于法线分布函数D,所以工业中都是首先从法线分布函数按史密斯阴影函数推导出真实的几何遮挡函数,然后再取一个近似函数,这个近似函数大都能直接通过roughness参数来直接计算。史密斯阴影函数的形式为:
$$
G_1(v,h)=\frac{\chi^+(v·h)}{1+\Lambda(v)}
$$
其中$\chi^+(\alpha)$在$\alpha>0$时为1,$\alpha\le0$时为0,$\frac{1}{1+\Lambda(v)}$为一般化的史密斯阴影函数$\Lambda(m)=\frac{-1+\sqrt{1+\alpha^2tan^2(\theta_m)}}{2}$

在迪士尼的BRDF模型中,给出一个近似方法:
$$
G_1(v,h)=\chi^+(\frac{v·h}{v·n}\frac{2}{1+\sqrt{1+\alpha_g^2tan^2\theta_v}})
$$
迪士尼将粗糙度参数$\alpha_g$从$[0,1]$重映射到$[0.25,1]$即:$\alpha_g=(0.5+roughness/2)^2$

后来Unreal Engine4选择使用Schlick近似模型:
$$
k=\frac{(roughness+1)^2}{8}\
G_1(v)=\frac{n·v}{(n·v)(1-k)+k}\
G(l,v,h)=G_1(1)G_1(v)
$$

漫反射BRDF

迪士尼使用了一个漫反射经验模型:
$$
f_d=\frac{baseColor}{\pi}(1+(F_{D90}-1)(1-cos\theta_l)^5)(1+(F_{D90}-1)(1-cos\theta_v)^5)
$$
这里$F_{D90}=0.5+2(roughness)cos^2\theta_d$。对于光滑的表面,该公式可以使其漫反射的反射率最小为0.5;对于粗糙的表面,则可以最大增加到2.5倍。

材质模型

上述方程中的参数可以统一封装到材质对象中,然后这些材质对象附加到不同的表面就使该表面拥有了对应性质。

《全局光照》中以UE4中的材质对象为例,输入的材质参数有:

  • Base Color:基础颜色
  • Roughness:粗糙度
  • Metallic:控制金属感,金属表面的值为1
  • Specular:只影响亮度不影响颜色,为0~1的浮点值

双向散射分布函数

上述的BRDF模型能通过几个参数模拟大部分表面材质,但当处理折射、次表面散射时需要其他处理,而且这些处理通常不能保证能量守恒。所以需要一个统一反射、折射和次表面散射并且保证能量守恒的函数–双向散射分布函数(bidirection scattering distribution function,BSDF),它其实是BTDF和BRDF的总和。

双向折射分布函数

工业中比较流行的双向折射分布函数(bidirection transmittance distribution function,BTDF)Walter模型基于微面元理论,假设入射光沿入射方向$i$从介质折射率为$\eta_i$的介质射入折射率为$\eta_o$的介质然后从观察方向$o$进行观察。由折射定律,定义一个相对折射率(relative IOR):$\eta=\eta_o/\eta_i$。

首先定义一个折射范围观察的半矢量$h_t$:
$$
h_t=-\frac{i+\eta o}{|i+\eta o|}
$$
则Walter的BTDF可以定义为:
$$
f_t(i,o,n)=\frac{|i·h_t|}{|i·n|}\frac{|o·h_t|}{|o·n|}\frac{\eta^2}{(i·h_t+\eta o·h_t)^2}(1-R_F(i,h_t))G(i,o,h_t)D(h_t)
$$

次表面散射

次表面散射是指光从一个点进入表面内部,经过内部一定散射后从另一个点散射出。

迪士尼并没有使用BSSDF替代BRDF,而是将BRDF进行了拆分:一部分是具有方向性的结构,另一部分是与方向无光的漫反射效果。这样当次表面散射出射点和入射点距离小于1像素时使用原模型,大于1像素时使用新的BSSRDF模型替换与方向无光的漫反射。

双向表面散射反射分布函数(bidirection surface scattering reflect distribution function,BSSRDF)通常可表示为:
$$
S(x_i,w_i;x_o,w_o)=CF_t(x_i,w_i)R(|x_o-x_i|)F_t(x_o,w_o)
$$
其中$F_t$表示菲涅耳折射率,R表示一个反射配置(reflect profile)

对原BRDF的拆分为:
$$
f_d=f_{lambert}(1-0.5F_L)(1-0.5F_V)+f_{retro-reflection}\
f_{lambert}=\frac{baseColor}{\pi}\
f_{retro-reflection}=\frac{baseColor}{\pi}R_R(F_L+F_V+F_LF_V(R_R-1))\
F_L=(1-cos\theta_l)^5\
F_V=(1-cos\theta_v)^5\
R_R=2roughness·cos^2\theta_d
$$

渲染方程

假设$L_e(x\to w_o)$表示光源在x处沿$w_o$方向上的辐射亮度,$L_r(x\to w_o)$表示物体在x处沿$w_o$方向的来自反射或折射的辐射亮度,则最终的辐射亮度$L$可以表示为:
$$
L(x\to w_o)=L_e(x\to w_o)+L_r(x\to w_o)
$$
由之前的BRDF定义:
$$
f_r(x,w_i\to w_o)=\frac{dL_r(x\to w_o)}{dE(x\gets w_i)}
$$
可得:
$$
L(x\to w_o)=L_e(x\to w_o)+\int_{\Omega_x}f_r(x,w_i\to w_o)L(x\gets w_i)cos(N_x,w_i)dw_{w_i}
$$
$\Omega_{x}$表示沿x点法线方向上的半空间,$N_x$为x点处的法线。