双向方法之SPPM

Danny Teng bio photo By Danny Teng

Importance函数与Measurement方程

我们知道Path Tracing是从相机出发,希望得到来自光源的光线。如果换一个方向来思考,从光源出发,希望得到来自相机的一个量。

GI解决的问题可以描述为解算每一个像素可见的能量。每一个像素都相当于一个传感器,决定如何应答入射的能量。这个应答函数所带来的量叫做importance,他可以像L一样传递,从而作为上面所说的来自相机的一个“量”。

Importance flows的方向和radiance的方向是相反的。假设有两个表面i和j,如果表面i通过像素平面可见,那么$W_e(i)$代表表面对于像素平面的重要程度。如果j也可见,且i反射光到j,那么j将会反射重要性给i,于是i间接地就比j更重要。

Measurement方程形式化了GI问题,他将两个重要的量集中到了一起—————Importance和Radiance.

对于每一个像素j,$M_j$表示通过像素的Radiance

如果将场景表面对应于像素,那么场景表面也能作为像素使用measurement方程。

散射不对称性

在Particle Tracing的时候,使用Importance和measurement方程来进行计算,这个时候必须要注意散射的不对称性,也就是入射和出射对换引起的变化。这一部分主要是折射和着色法线。具体内容可参考PBRT P960.

SPPM

SDS传输问题

考虑这样一个光路,从光源出发,通过一个specular折射,然后在通过一个diffuse散射,最后在通过一个specular反射。 这样的光路几乎无法击中摄像机,从摄像机来看,出发的光线通过一个diffuse表面,在通过一个specular反射或者折射表面也几乎无法再击中光源。

如果光源被一个specular表面遮罩,那么每一条光路都将会始于S,问题将会更加明显。

解决这个问题有很多方法,PM,PPM,SPPM,VCM,PSR,ME等等。

这里主要说一下相对比较古老的SPPM。

原理

PM

PM主要是从光源Trace一系列的photon,将这些photon的记录在光子图上(越亮的地方光子越多),通过插值来得到最终图像。

PM的优点:

  • 焦散和间接光照都能快速收敛
  • 高频噪声能够很快地被清除

缺点是:

  • 内存消耗巨大
  • 无法人为估量应该发射多少光子
  • 插值具有亮块和走样

模糊平均和插值为PM带来正确的结果,但是最终却能达到视觉正确,所以是一个有偏一致(如果有无数光子发射的话数学上可证明一致)的算法。

PPM

PPM主要解决了无限光子的问题。

第一个pass,从像素执行PT,到了某一个场景点,使用rr停止PT,将光照分为发射光,直接光和间接光,前二者可以使用PT来计算,间接光照可以这样解决:一种是采样bsdf,找到path 的下一个顶点,接下来就要开始计算这个点的$L_o$,递归下去,这就依然是PT。另外就是将这个$L_o$计算需要的信息(位置,需要的出射方向(也即等价le的方向),bsdf,path throughput)保留到一个VP中,通过之后的photon tracing来解决它。

对于一个specular或者glossy表面,前者只能采用前一种方法,后者最好采用第一种方法。因为对于specular表面来说,brdf采样方向只有一个,几乎不可能有随机发射的光子从这个方向过来,于是大多数时候这个地方使用光子方向计算的brdf都是0,造成相当高的方差;而对于glossy表面,想要光子从一个很狭窄的方向过来必须发射巨量的光子才能较为精确地计算,所以在这两种表面上都直接采用PT方法直接Tracing下去,而不用pm方法。

对于漫反射表面,这个所需要的等价$L_e$就是某个点的$L_o$,使用Photon tracing来计算这个$L_o$(注意这是一个反向过程,在计算途中要注意散射对称性。).

第一pass使用PT累计了VP解算了高光表面之后,进行Photon tracing。第二pass叫做最终聚集,对于漫反射表面,要解算$L_o$有如下方程:

将此方程写为等价的基于整个场景表面的measurement方程得到(也就是将整个场景看做像素平面):

此时可以得到Importance:

注意这个Importance是无法采样的,因为类似于正向方法中,想要采样一个点光源一样,某一个表面点也是无法采样的。所以此时引入bias,使用一个范围内的vp,Importance中的狄拉克函数变为了一个过滤函数,此时可以使用这个Importance描述一个表面点的重要性,周围的光子越多,重要性越高,入射的radiance越多。

解算这个measurement方程使用mc方法,采用下列公式:

采用photon tracing使用公式:

$q_{i,j}$是rr概率.

类似PT地迭代计算$\beta_j$,得出最终交点后,在范围内搜索VP,每个VP的Importance使用插值方法后直接写为brdf,也就是得到了这个公式,此时这个measurement方程近似为下列方程:

$N_p$是光源发射的光子总数,$\pi r^2$是圆盘核函数的表面积。

现在得到了$L_o$,将其带回PT中缺少的那个$L_e$中去,就能得出PT的结果。

SPPM

PPM只使用一遍pass 1,虽然不储存光子,但是需要得到非常多的vp来保证结果不走样,对于高分辨率图像,依然会消耗大量内存。SPPM将使用多次迭代,每次都采样不一样的vp,重复PPM的过程,并不断累积结果,最终解决了内存问题。

实现对比

第一、第二张为120 spp和1200spp的path tracing,第三、四张是使用每次迭代2000光子迭代1000和1800次以后的SPPM:

其他一些截图: