光线采样中的FAQ

蒙特卡洛积分法看起来还是很直观的,但是在有些场合下,怎么采样以及为什么能这么采样感性理解也知道怎么回事,但是为什么work就并不是那么直观的事情。

这篇小水文就是在学了概率论以后重新审视采样光线的过程发现自己之前有些细节确实想的不是很清楚才写下来的。

1. 蒙特卡洛积分法为什么work\text{1. 蒙特卡洛积分法为什么work}

大家多多少少也听说过这个啦:

1Ni=1Nf(xi)p(xi)f(x)dx\frac{1}{N}\sum\limits_{i=1}^N\frac{f(x_i)}{p(x_i)}\approx \int f(x)\text{d}x

但是之前想过一个问题,假如我采样的贡献f(x)=0f(x)=0,不仅对结果没有贡献,反而因为样本数增加了,NN增大了,结果难道不会会偏小?

如果知道用大数定律来解释这个就会很容易说明了。

我们每次采样Xi=f(xi)p(xi)X_i = \frac{f(x_i)}{p(x_i)}实际上是个独立同分布,我们有:

E[f(xi)p(xi)]=f(xi)p(xi)p(xi)dxi=f(x)dxE[\frac{f(x_i)}{p(x_i)}]=\int\frac{f(x_i)}{p(x_i)}p(x_i)\text{d}x_i=\int f(x)\text{d}x

需要注意的是,从概念上讲,这里的xix_i是“样本”而不是随机变量,随机变量是样本空间的函数,在这里指的是XiX_i.

换句话说,对于每个随机变量XiX_i都有E[Xi]=f(x)dxE[X_i]=\int f(x)\text{d}x

根据辛钦大数定律,才有

1Ni=1NXiPf(x)dx\frac{1}{N}\sum\limits_{i=1}^NX_i\stackrel{P}{\longrightarrow}\int f(x)\text{d}x

换言之,这里f(xi)f(x_i)取值是不是00毫无关系,采样的样本没有贡献直接置00不影响正确性。

2. 优雅地采样反射和折射\text{2. 优雅地采样反射和折射}

采样反射的过程非常好说,采样折射的过程也非常好说,但是要把这俩结合起来,就不是那么显然了,因为一次只能采一条,怎么无偏地估计积分值就意味着我们得控制发生两种采样的概率。条理分明地考虑起来还是可以想通的。

我们把要算的积分式简要的写出来:

L=Fr(ω)f(ω)dω+Ft(ω)f(ω)dωL=\int F_r(\omega)f(\omega)\text{d}\omega+\int F_t(\omega)f(\omega)\text{d}\omega

在已知出射方向的情况下采样入射方向ω\omega,若已知ω\omega就可以判断发生的是反射还是折射,进而就能计算出来菲涅尔项。

但是注意我们首先采样的是半程向量,我们不妨把上面这个式子写成按半程向量积分。

L=Fr(H)f1(H)+Ft(H)f2(H)dHL=\int F_r(H)f_1(H) + F_t(H)f_2(H)\text{d}H

含义还是很明确的明确个锤子啊。对于所有的半程向量,我们考虑在这些微表面上反射到出射方向以及折射到出射方向的Radiance\text{Radiance}。之所以这里写了f1f_1f2f_2是因为对于同一个半程向量HH,反射和折射的方向不一样,Radiance\text{Radiance}自然是不一样的。

接下来我们用全期望公式把我们估计积分值的随机变量的期望写出来:

E[X]=p(H){X(反射)P(反射H)+X(折射)P(折射H)}dHE[X] = \int p(H)\{X(反射)P(反射|H)+X(折射)P(折射|H)\}\text{d}H

我们可以发现,因为两种单独的采样我们都会,而且我们计算的时候算的都是

X(ω)=f(ω)p(H)JacobianX(\omega)=\frac{f(\omega)}{p(H)\text{Jacobian}}

就可以发现p(H)\text{p(H)}消掉了,并且由于Jacobian\text{Jacobian}的存在,积分变成了对入射方向omega\text{omega}积分

E[X]={f(ωreflect)P(反射H)dωreflect+f(ωrefract)P(折射H)}dωrefractE[X] = \int \{f(\omega_{reflect})P(反射|H)\text{d}\omega_{reflect}+\int f(\omega_{refract})P(折射|H)\}\text{d}\omega_{refract}

对比一下最开始的积分式就能发现,应当取P(反射H)=Fr(ω),P(折射H)=Ft(ω)P(反射|H)=F_r(\omega), P(折射|H)=F_t(\omega)

因此我们就知道了应该怎么做:首先采样半程向量HH,然后计算菲涅尔项,以菲涅尔项作为概率选择反射和折射采样的一种。