蒙特卡洛积分法看起来还是很直观的,但是在有些场合下,怎么采样以及为什么能这么采样感性理解也知道怎么回事,但是为什么work就并不是那么直观的事情。
这篇小水文就是在学了概率论以后重新审视采样光线的过程发现自己之前有些细节确实想的不是很清楚才写下来的。
1. 蒙特卡洛积分法为什么work
大家多多少少也听说过这个啦:
N1i=1∑Np(xi)f(xi)≈∫f(x)dx
但是之前想过一个问题,假如我采样的贡献f(x)=0,不仅对结果没有贡献,反而因为样本数增加了,N增大了,结果难道不会会偏小?
如果知道用大数定律来解释这个就会很容易说明了。
我们每次采样Xi=p(xi)f(xi)实际上是个独立同分布,我们有:
E[p(xi)f(xi)]=∫p(xi)f(xi)p(xi)dxi=∫f(x)dx
需要注意的是,从概念上讲,这里的xi是“样本”而不是随机变量,随机变量是样本空间的函数,在这里指的是Xi.
换句话说,对于每个随机变量Xi都有E[Xi]=∫f(x)dx
根据辛钦大数定律,才有
N1i=1∑NXi⟶P∫f(x)dx
换言之,这里f(xi)取值是不是0毫无关系,采样的样本没有贡献直接置0不影响正确性。
2. 优雅地采样反射和折射
采样反射的过程非常好说,采样折射的过程也非常好说,但是要把这俩结合起来,就不是那么显然了,因为一次只能采一条,怎么无偏地估计积分值就意味着我们得控制发生两种采样的概率。条理分明地考虑起来还是可以想通的。
我们把要算的积分式简要的写出来:
L=∫Fr(ω)f(ω)dω+∫Ft(ω)f(ω)dω
在已知出射方向的情况下采样入射方向ω,若已知ω就可以判断发生的是反射还是折射,进而就能计算出来菲涅尔项。
但是注意我们首先采样的是半程向量,我们不妨把上面这个式子写成按半程向量积分。
L=∫Fr(H)f1(H)+Ft(H)f2(H)dH
含义还是很明确的明确个锤子啊。对于所有的半程向量,我们考虑在这些微表面上反射到出射方向以及折射到出射方向的Radiance。之所以这里写了f1和f2是因为对于同一个半程向量H,反射和折射的方向不一样,Radiance自然是不一样的。
接下来我们用全期望公式把我们估计积分值的随机变量的期望写出来:
E[X]=∫p(H){X(反射)P(反射∣H)+X(折射)P(折射∣H)}dH
我们可以发现,因为两种单独的采样我们都会,而且我们计算的时候算的都是
X(ω)=p(H)Jacobianf(ω)
就可以发现p(H)消掉了,并且由于Jacobian的存在,积分变成了对入射方向omega积分
E[X]=∫{f(ωreflect)P(反射∣H)dωreflect+∫f(ωrefract)P(折射∣H)}dωrefract
对比一下最开始的积分式就能发现,应当取P(反射∣H)=Fr(ω),P(折射∣H)=Ft(ω)
因此我们就知道了应该怎么做:首先采样半程向量H,然后计算菲涅尔项,以菲涅尔项作为概率选择反射和折射采样的一种。