我们知道,VCM(Vertex Connection & Merging)把PM(Photon Mapping)和BDPT(Bidirectional Path Tracing)融合了起来,可以鲁棒地handle一些比较难的场景。但是对大多数应用来说VCM的overhead实在太大了,大多数时候我们只需要用PT(Path Tracing)绘制不算复杂的照明,然后加上用PM画的焦散,所以这里讨论以下怎么把这两个算法结合起来,算是VCM的简化版。
长度不超过3的路径
对长度为2的路径x1x2,我们简单地从摄像机镜头上的点x1发出射线,击中x2处的光源,不需要做什么特别的处理。
对长度为3的路径x1x2x3,我们使用MIS(Multiple Importance Sampling)结合BSDF采样和光源采样,也不需要PM的参与。
长度超过3的路径
对长度k>3的路径xˉ=x1x2⋯xk,采样该路径的方法一共有三类:
- Unidirectional PT,直接用一系列BSDF采样构造出整个路径
- Unidirectional PT,但在到达xk−1后转而使用光源采样得到xk
- 在x2,…,xk−2处使用VM(Vertex Merging),融合光子图中的顶点,得到剩下的路径
这些方法对应的路径pdf为:
pPTbsdf(xˉ)pPTlight(xˉ)pVMt(xˉ)=p(x1)i=2∏kp(xi−1→xi)=p(x1)i=2∏k−1p(xi−1→xi)plight(xk∣xk−1)=p(x1)i=2∏tp(xi−1→xi)i=t∏k−1p(xi←xi+1)p(xk)πr2
其中p(a→b)是使用BSDF采样从顶点a采样顶点b的area pdf,p(a←b)是其adjoint版本,plight是光源采样的area pdf,p(x1)是摄像机镜头上的area pdf,p(xk)是光子发射源的area pdf。现假设一共发射了NVM个光子,那么对采样方法v,其MIS权重是:
wv(xˉ)=pPTbsdf(xˉ)+pPTlight(xˉ)+NVM∑t=2k−2pVMt(xˉ)pv(xˉ)
计算wPT
我们做一些形式上的变换:
wPTbsdf(xˉ)1=1+p(xk−1→xk)plight(xk∣xk−1)+NVMπr2t=2∑k−2∏i=2kp(xi−1→xi)∏i=2tp(xi−1→xi)∏i=tk−1p(xi←xi+1)p(xk)=1+p(xk−1→xk)plight(xk∣xk−1)+p(xk−1→xk)NVMπr2p(xk)t=2∑k−2p(xt←xt+1)i=t+1∏k−1p(xi−1→xi)p(xi←xi+1)
令:
dPTm=t=2∑mp(xt←xt+1)i=t+1∏m+1p(xi−1→xi)p(xi←xi+1)=p(xm→xm+1)p(xm←xm+1)p(xm+1←xm+2)+t=2∑m−1p(xt←xt+1)p(xm→xm+1)p(xm+1←xm+2)i=t+1∏mp(xi−1→xi)p(xi←xi+1)
把m换成τ=m+2,那么:
dPT3dPTτwPTbsdf(xˉ)=0=p(xτ−2→xτ−1)p(xτ−2←xτ−1)p(xτ−1←xτ)+p(xτ−2→xτ−1)p(xτ−1←xτ)dPTτ−1=1+p(xk−1→xk)plight(xk∣xk−1)+p(xk−1→xk)NVMπr2p(xk)dPTk1
同理:
wPTlight=1+plight(xk∣xk−1)p(xk−1→xk)+plight(xk∣xk−1)NVMπr2p(xk)dPTk1
计算wVM
整理一下形式:
wVMt(xˉ)1=∏i=2tp(xi−1→xi)∏i=tk−1p(xi←xi+1)p(xk)πr2∏i=2k−1p(xi−1→xi)(plight(xk∣xk−1)+p(xk−1→xk))+NVMr=2∑k−2∏i=2tp(xi−1→xi)∏i=tk−1p(xi←xi+1)∏i=2rp(xi−1→xi)∏i=rk−1p(xi←xi+1)=W1+NVMW2
W1用于融合VM和PT,W2用于融合不同位置处的VM,接下来分别计算这俩。
计算W1
W1=∏i=2tp(xi−1→xi)∏i=tk−1p(xi←xi+1)p(xk)πr2∏i=2k−1p(xi−1→xi)(plight(xk∣xk−1)+p(xk−1→xk))=∏i=tk−1p(xi←xi+1)p(xk)πr2∏i=t+1k−1p(xi−1→xi)(plight(xk∣xk−1)+p(xk−1→xk))=p(xt←xt+1)p(xk)πr2plight(xk∣xk−1)+p(xk−1→xk)i=t+1∏k−1p(xi←xi+1)p(xi−1→xi)
记yi=xk+1−i,则:
W1=p(xt←xt+1)p(y1)πr2plight(y1∣y2)+p(y2→y1)i=1∏k−(t+1)p(yi→yi+1)p(yi+1←yi+2)
令:
dVMTm=i=1∏mp(yi→yi+1)p(yi+1←yi+2)
并将m替换为τ=m+2,那么:
dVMT1dVMTτW1=dVMT2=1=p(yτ−2→yτ−1)p(yτ−1←yτ)dVMTτ−1 (3≤τ≤k−t+1)=p(xt←xt+1)p(y1)πr2plight(y1∣y2)+p(y2→y1)dVMTk−t+1
计算W2
把W2按和式的下标拆成三项:
W2=r=2∑k−2∏i=2tp(xi−1→xi)∏i=tk−1p(xi←xi+1)∏i=2rp(xi−1→xi)∏i=rk−1p(xi←xi+1)=1+r=2∑t−1∏i=2tp(xi−1→xi)∏i=tk−1p(xi←xi+1)∏i=2rp(xi−1→xi)∏i=rk−1p(xi←xi+1)+r=t+1∑k−2∏i=2tp(xi−1→xi)∏i=tk−1p(xi←xi+1)∏i=2rp(xi−1→xi)∏i=rk−1p(xi←xi+1)=1+W21+W22
然后分别整理W21和W22:
W21W22=r=2∑t−1∏i=2rp(xi−1→xi)∏i=r+1tp(xi−1→xi)∏i=tk−1p(xi←xi+1)∏i=2rp(xi−1→xi)∏i=rt−1p(xi←xi+1)∏i=tk−1p(xi←xi+1)=p(xt−1→xt)1r=2∑t−1p(xr←xr+1)i=r+1∏t−1p(xi−1→xi)p(xi←xi+1)=r=t+1∑k−2∏i=2tp(xi−1→xi)∏i=tr−1p(xi←xi+1)∏i=rk−1p(xi←xi+1)∏i=2tp(xi−1→xi)∏i=t+1rp(xi−1→xi)∏i=rk−1p(xi←xi+1)=p(xt←xt+1)1r=t+1∑k−2p(xr−1→xr)i=t+1∏r−1p(xi←xi+1)p(xi−1→xi)=p(xt←xt+1)1r=3∑k−tp(yr←yr+1)i=r+1∏k−tp(yi−1→yi)p(yi←yi+1)
令:
dVM→mdVM←m=r=2∑mp(xr←xr+1)i=r+1∏mp(xi−1→xi)p(xi←xi+1)=p(xm←xm+1)+r=2∑m−1p(xr←xr+1)p(xm−1→xm)p(xm←xm+1)i=r+1∏m−1p(xi−1→xi)p(xi←xi+1)=r=3∑mp(yr←yr+1)i=r+1∏mp(yi−1→yi)p(yi←yi+1)=p(ym←ym+1)+r=3∑m−1p(yr←yr+1)p(ym−1→ym)p(ym←ym+1)i=r+1∏m−1p(yi−1→yi)p(yi←yi+1)
并将m替换为τ=m+1,那么:
dVM→1dVM←1dVM→τdVM←τW21W22=dVM→2=0=dVM←2=dVM←3=0=p(xτ−1←xτ)+p(xτ−2→xτ−1)p(xτ−1←xτ)dVM→τ−1 (3≤τ≤t)=p(yτ−1←yτ)+p(yτ−2→yτ−1)p(yτ−1←yτ)dVM←τ−1 (4≤τ≤k−t+1)=p(xt−1→xt)1dVM→t=p(xt←xt+1)1dVM←k−t+1
Specular Event
如果某个顶点xi(2≤i≤k−2)或yi(3≤i≤k−t+1)处的散射是specular,那么在这里没法做vertex merging,有几个d需要对应地做出修改。
注意到:
dPTτ=t=4∑τp(xt−2←xt−1)⋯
在∑中,t=t0所代表的项对应了在xt0−2处进行的VM。因此,xi为specular顶点意味着dPTi+2的递推式中只包含上一项的乘积项,不包含另一个求和项。
类似地:
dVM→τdVM←τ=r=3∑τp(xτ−1←xτ)⋯=r=4∑τp(yτ−1←yτ)⋯
在∑中,r=r0代表的项对应xr0−1或yr0−1处进行的VM,因此xi或yi为specular意味着dVM→i+1或dVM←i+1的递推式中只包含乘积项。
实现
光子图生成
注意到dVMTτ的计算依赖于p(yτ−2→yτ−1)和p(yτ−1←yτ),前者在构造光子路径时可以顺便记下来,但是后者的完整形式是p(yτ−1←yτ←yτ+1),其中的yτ+1为Camera Subpath的末端倒数第二个顶点,在构造光子图时是未知的。也就是说,光子yi处记录的数据只能是dVMTi−1/p(yi−2→yi−1),实际的dVMTi只有在VM时才能计算。类似地,yi处只记录dVM←i−1/p(yi−2→yi−1)。
整理一下,光子yi需要携带的信息至少包括βp,pdfp,dVMTi−1,dVM←i−1,plight(y1∣y2),p(y2→y1),p(y1):
- βp,pdfp
- dVMTi−1/p(yi−2→yi−1)
- dVM←i−1/p(yi−2→yi−1)
- (plight(y1∣y2)+p(y2→y1))/p(y1)
其中第四项可以预先乘到第二项上。
路径追踪
追踪一条路径的时候,需要携带的信息包括:
- β,pdf
- dPTi−1,p(xi−2→xi−1),p(xi−2←xi−1)
- dVM→i−1,p(xi−2→xi−1)
每追踪到一个新顶点xa(a>=2),都需要执行下面的操作:
- 如果xa是光源表面的点,那么:
- a = 2,则构成一条长度为2的路径,直接计算最终计算
- a = 3,则存在BSDF采样和光源采样两种构成路径的技术,MIS之
- a > 3,则存在两种PT技术和许多种PM技术,利用dPT计算出MIS权重
- 在光源表面采样一点xa+1,连接xa和xb构成完整的路径,此时:
- a + 1 = 3,则存在BSDF采样和光源采样两种构成路径的技术,MIS之
- a + 1 > 3,则使用dPT计算MIS权重
- 搜索光子图中xa周围的光子,对每个光子做VM,并用dVM→计算其MIS权重