路径追踪中的多重重要性采样
前言
在GAMES101课程中,介绍了使用蒙特卡洛方法来求解路径追踪问题,为了简化求解过程,当光线打到物体表面发生反射时,我们对表面法线半球进行均匀随机采样来获取反射光线。由于半球上各个方向光线对该物体表面的radiance贡献不同,因此,如果使用随机采样的方法,往往会伴随着非常明显的噪声。因此,使用重要性采样的方法可以帮助我们降噪。
一、光源重要性采样
1. 重要性采样
首先回顾一下蒙特卡洛积分的基本形式:
$$ \int_{a}^{b}f(x)dx = \frac{1}{N} \sum_{i = 1}^{N} \frac{f(X_i)}{pdf(X_i)} $$
对任意的$f(x)$都可以使用蒙特卡洛方法来近似,通过对指定的概率密度分布进行采样,最终代入求均值即可。但是使用的采样策略($pdf$)往往会对近似结果的误差和收敛速度产生巨大影响。
那么采用什么样的采样策略$(pdf)$,可以得到一个误差较小且收敛速度较快的结果呢?
当$pdf(x)$ 图像和$f(x)$图像越相似时,我们得到的结果会越好,在极端情况下,$pdf(x) = cf(x)$,即$pdf(x)$完全正比于$f(x)$,这个时候方差为0,我们只需采样一次就能得到积分的正确结果。证明如下:
$$ V(\frac{1}{N}\sum_{i=1}^{N}\frac{f(X_i)}{pdf(X_i)}) = V(\frac{1}{N}\sum_{i=1}^{N}\frac{f(X_i)}{cf(X_i)}) = V(\frac{1}{N}\sum_{i=1}^{N}\frac{1}{c}) = V(\frac{1}{c}) = 0 $$
从直观上也很好理解,某一区域函数值较大时,该区域对最终积分值的贡献也越大,因此在该区域采样密度更大时,可以有效加快收敛速度,同时减小误差。
2. 对光源采样
回到路径追踪的问题中,我们需要求解的方程:
$$ L_o(p,\omega_o) = L_e(p,\omega_o) + \int_{\Omega^+}L_i(p,\omega_i)f_r(p, \omega_i, \omega_o)(n\cdot\omega_i)d\omega_i $$
其中方程的$L_e(p,\omega_o)$可以直接查询,而后面的积分部分则用蒙特卡洛方法求解,因此,暂不考虑物体的自发光,我们可以求解渲染方程:
$$ L_o(p,\omega_o) =\frac{1}{N}\sum_{i = 1}^{N} \frac{L_i(p,\omega_i)f_r(p, \omega_i, \omega_o)(n\cdot\omega_i)}{pdf(\omega_i)} $$
当$\omega_i$指向光源时,$L_i(p,\omega_i)$的值较大,如果暂不考虑$f_r$项,显然,为了减少误差、加快收敛速度,我们应该集中在指向光源的$\omega_i$处采样。由于光源在场景中的位置是已知的,因此可以直接采样到光源的位置,将对$\omega_i$的采样转变为对光源面积$A$的采样,我们先改写渲染方程:
有了渲染方程和求解方法,写出伪代码也很简单:
二、brdf采样
在对光源重要性采样时,我们只考虑到$L_i(x,\omega_i)$,而没有考虑$f_r$项的影响,实际上,$f_r(p,\omega_i,\omega_o)$也是被积函数的一部分,它决定了光线打到物体上时折射光线的比例、反射光线的比例和分布等信息。如果brdf比较difusse,那么反射光线就会比较均匀地分布在法线半球上,这个时候使用均匀随机采样的策略并没有什么问题,但是如果brdf比较glossy,那么反射光线就会比较集中,只会有一个区域的radiance会对着色点有较大贡献,其他区域的贡献相对小很多,这个时候如果使用均匀随机采样,会产生较大噪声,且不易收敛。相反,重要性采样理论告诉我们,我们需要在反射光线密集的区域采样,这样就会减小噪声,且更易收敛。
要对brdf进行采样,首先要确定brdf的形式,我们采用Microfacet BRDF:
$$ f(i,o) = \frac{F(i,h)G(i,h,o)D(h)}{4(n,i)(n,o)} $$
其中,i为入射方向,o为出射方向,h为normalize(i+o),F为菲涅尔项,G为几何函数,D为法线分布函数。菲涅尔项定义了当入射光从不同角度打向平面时,反射光的比例。
几何函数定义了当入射光从接近平行于表面的方向集中表面时,微表面的自遮蔽。
法线分布函数为每单位面积,每单位立体角所有法向为$h$的微平面的面积。
所以这里最后需要的$pdf$是怎么样的呢?
$$ pdf(\omega_i) = \frac{cos \theta_h}{4\omega_i \cdot \omega_h} D(\omega_h) $$
三、多重重要性采样(MIS)
场景中有4个大小不一,颜色不同的光源,悬挂在半空中,还有四块长板子,这4块长板有着不同的光滑程度,最底端的最为粗糙,最顶端的最为光滑。
在这样一个设置之下直接对光源采样来计算直接光照得到的就是上图中的结果,可以看到在图片的右上角部分十分的noisy。造成这种现象的原因是长板十分光滑,意味着它的BRDF接近delta函数(只有一个小范围才可能对计算结果有贡献),而光源又比较大,在这么大一个光源上进行均匀采样的时候,很难恰好找到那一个有贡献的小的范围,而这就造成了越靠近右上角越noise的现象。
当我们使用BRDF采样,难看到在图片的左下角依然出现了非常noise的现象,造成这样的结果的原因是长板十分粗糙,所以用BRDF采样的时候其实也就有点接近均匀采样了,那么对于很小的光源几乎就是不可能碰撞到的了。
不难发现,BRDF采样和光源采样的方法正好互补,使用MIS(Multiple Importance Sampling)可以把这两种方法的优点结合起来。
MIS提供了一种将多种采样分布结合起来的无偏估计的方法,假设现在有$N$种采样分布,每种采样分布采样了$n_i$个点,则最后的估计为:
$$ F = \sum_{i=1}^{N}\frac{1}{n_i}\sum_{j = 1}^{n_i}\omega_i(X_{i,j})\frac{f(X_{i,j})}{pdf_i(X_{i,j})} $$
其中,
$$ \sum_{i = 1}^{n}\omega_i(x) = 1 \ whenever\ f(x)\neq 0, \ \omega_i(x)=0\ whenever\ pdf_i(x) = 0 $$
在路径追踪问题中,我们的$\omega(x)$函数定义为: $$ \omega_i(x) = \frac{pdf_i(x)}{\sum_{j}pdf_j(x)} $$
这种设置方法的目的很直接,倘若在一个点你采样的$pdf$越大,其实也就说明了这个重要性采样分布更加擅长这个区域,理应给它更高的权重,而如果$pdf$小,意味着该重要性采样分布对这个区域没有什么自信,当然应该减小权重,来降低误差。可能这样说比较抽象,=以=开始的场景为例子,假设$pdf_1$为光源采样,$pdf_2$为BRDF采样。
- 当在右上角使用光源采样的时候,由于光源较大,那么$pdf_1$自然就会比较小,而BRDF采样由于长板比较光滑,所以$pdf_2$会相对较大,综合下来$\omega_1$就会比较小,降低了在右上角使用光源采样从而造成的误差(想想第一张图的那些右上角noise,现在都会被乘一个小的权重)
- 当在左下角使用BRDF采样的时候,由于光源较小,那么$pdf_1$自然就会比较大,而此时长板十分粗糙,所以$pdf_1$就比较小,因此就会比较小,降低了在左上角使用BRDF采样从而造成的误差(想想第二张图的那些左下角noise,现在都会被乘一个小的权重)
在使用了多重重要性采样后,得到最终的效果: