我们知道,VCM(Vertex Connection & Merging)把PM(Photon Mapping)和BDPT(Bidirectional Path Tracing)融合了起来,可以鲁棒地handle一些比较难的场景。但是对大多数应用来说VCM的overhead实在太大了,大多数时候我们只需要用PT(Path Tracing)绘制不算复杂的照明,然后加上用PM画的焦散,所以这里讨论以下怎么把这两个算法结合起来,算是VCM的简化版。

长度不超过3的路径

对长度为2的路径,我们简单地从摄像机镜头上的点发出射线,击中处的光源,不需要做什么特别的处理。

对长度为3的路径,我们使用MIS(Multiple Importance Sampling)结合BSDF采样和光源采样,也不需要PM的参与。

长度超过3的路径

对长度的路径,采样该路径的方法一共有三类:

  1. Unidirectional PT,直接用一系列BSDF采样构造出整个路径
  2. Unidirectional PT,但在到达后转而使用光源采样得到
  3. 处使用VM(Vertex Merging),融合光子图中的顶点,得到剩下的路径

这些方法对应的路径pdf为:

其中是使用BSDF采样从顶点采样顶点的area pdf,是其adjoint版本,是光源采样的area pdf,是摄像机镜头上的area pdf,是光子发射源的area pdf。现假设一共发射了个光子,那么对采样方法,其MIS权重是:

计算wPT

我们做一些形式上的变换:

令:

换成,那么:

同理:

计算wVM

整理一下形式:

用于融合VM和PT,用于融合不同位置处的VM,接下来分别计算这俩。

计算W1

,则:

令:

并将替换为,那么:

计算W2

按和式的下标拆成三项:

然后分别整理

令:

并将替换为,那么:

Specular Event

如果某个顶点处的散射是specular,那么在这里没法做vertex merging,有几个需要对应地做出修改。

注意到:

中,所代表的项对应了在处进行的VM。因此,为specular顶点意味着的递推式中只包含上一项的乘积项,不包含另一个求和项。

类似地:

中,代表的项对应处进行的VM,因此为specular意味着的递推式中只包含乘积项。

实现

光子图生成

注意到的计算依赖于,前者在构造光子路径时可以顺便记下来,但是后者的完整形式是,其中的为Camera Subpath的末端倒数第二个顶点,在构造光子图时是未知的。也就是说,光子处记录的数据只能是,实际的只有在VM时才能计算。类似地,处只记录

整理一下,光子需要携带的信息至少包括

其中第四项可以预先乘到第二项上。

路径追踪

追踪一条路径的时候,需要携带的信息包括:

每追踪到一个新顶点,都需要执行下面的操作:

  1. 如果是光源表面的点,那么:
    • a = 2,则构成一条长度为2的路径,直接计算最终计算
    • a = 3,则存在BSDF采样和光源采样两种构成路径的技术,MIS之
    • a > 3,则存在两种PT技术和许多种PM技术,利用计算出MIS权重
  2. 在光源表面采样一点,连接构成完整的路径,此时:
    • a + 1 = 3,则存在BSDF采样和光源采样两种构成路径的技术,MIS之
    • a + 1 > 3,则使用计算MIS权重
  3. 搜索光子图中周围的光子,对每个光子做VM,并用计算其MIS权重