【离线渲染】自适应光子映射(二):自适应马尔科夫链和并行退火

目录

1.1概述

1.2采样空间和可视函数

2.1并行退火蒙特卡罗

2.2公式推导

2.3归一化项的渐进估计

3.1自适应马尔科夫链蒙特卡罗方法

2.4突变样本增加值

3.1算法

3.2实现


1.1概述

在只有一小部分被照亮的表面可以在渲染图像中看到的场景中,SPPM变得比较低效。这种问题对各种光子映射算法都是存在的,自适应光子映射算法则可以较好的解决这种问题。其核心思想是定义一个光子路径的visibility function并根据这个可视函数进行重要性采样。

[上图]自适应光子映射的采样空间。我们在这个随机数空间内定义了一个函数V(x),如果x对应的光子路径对最终图像有贡献则返回1(图中绿色部分),否则返回0(图中红色部分)。

这个采样空间和PSSMLT中的原采样空间类似,都对应一系列的随机数。之后为了从给定的随机数中生成光子路径,我们通过局部重要性采样来选择光源、采样BRDFs和俄罗斯轮盘概率。为了更好地对原采样空间进行采样,自适应光子映射结合了自适应马尔科夫链方法和并行退火算法。

1.2采样空间和可视函数

对于一条给定的光子路径\vec{u},我们定义了一个光子路径visibility functionV(\vec{u})。当该路径中的任何光子对图像造成了贡献时返回1,否则返回0。而importance function就是这个visibility function的单位化版本F(\vec{u})=\frac{V(\vec{u})}{V_{c}},这里的V_{c}=\int V(\vec{u}) d (\vec{u}).这个函数的好处之一就是样本不会被卡在某个峰值处。

2.1并行退火蒙特卡罗

模拟退火的目标是将目标函数表示为某个温度参数的形式,这个参数控制着不同状态之间的转移效率,通过在不同参数形式的表述之间进行跳跃,可以有效地防止突变样本被卡在局部区域。这类相关的方法又称Extended Ensemble Monte Carlo。根据温度参数的作用不同,目前大概有两类退火算法,第一类被称为序列退火,第二类是并行退火(Parallel Tempering),即本文用到的方法。

如果我们使用常规的MCMC方法去从一个有着两个峰值并且互不相连的重要性函数中采样时,那么马尔科夫链会被困在一个峰值内很长时间。并行退火算法就可以通过引入一个新的马尔科夫链来避免这个问题。即使一个马尔可夫链被卡在一个峰上,这个链也可以在均匀分布中与另一个马尔可夫链交换,而不改变通过并行退火算法得到的样本分布

给定一系列的多重重要性函数F_{1}(\vec{u}) .......F_{Q}(\vec{u}),我们根据这些函数定义了一系列的生成样本\vec{U}=\left \{ \vec{u_{1}}......\vec{u_{2}} \right \}\vec{U}可以被认为从下列函数中得到的一个样本:\widetilde{F}(\vec{U})=\prod _{k=1}^{Q}F_{k}(\vec_{u_{k}}),这里的的\vec{u_{k}}F_{k}的一个样本。

我们通过一种交换的操作来实现在不同分布函数之间的跳跃,即将目标函数F_{i}(\vec{u_{i}})中的样本值用在目标函数F_{j}(\vec{u_{j }})中,并同时将目标函数F_{j}(\vec{u_{j }})中的样本值用在目标函数F_{i}(\vec{u_{i}})中,在这种交换的转移过程中,必须要确保总的马尔科夫链满足细致平衡条件,这可以通过如下的接受率来实现,即:r(\vec{u_{i}},\vec{u_{j}})=min(1,\frac{F_{i}(\vec{u_{j}})F_{j}(\vec{u_{i}})}{F_{i}(\vec{u_{i}})F_{j}(\vec{u_{j}})})

2.2公式推导

由于F(\vec{u})要么为0要么为\frac{1}{V_{c}},并且I(\vec{u})始终为1,我们可以进行如下变换:

r(\vec{u_{I}},\vec{u_{F}})=min(1,\frac{F(\vec{u_{I}})I(\vec{u_{F}})}{F(\vec{u_{F}})I(\vec{u_{I}})})= \frac{F(\vec{u_{I}})1}{\frac{1}{V_{c}}1}=V(\vec{u_{I}})

最终的结果就很简单了,因为样本\vec{u_{I}}是来自均匀采样,那么就没有必要去继续跟踪\vec{u_{I}}的马尔科夫链。如果一个均匀的独立采样生成了一个可被采用的路径(V(\vec{u_{I}})=1),那么我们就替换掉当前路径,否则我们就保持当前的路径并进行正常的突变(V(\vec{u_{I}})=0)。

2.3归一化项的渐进估计

我们可以估计归一化项为V_{c}\approx \frac{N_{I,V(\vec{u})}=1}{N_{I,total}},这里的N_{I,V(\vec{u})}=1是可见路径的数量,而N_{I,total}实际上就等于从F(\vec{u})中生成的光子路径的数量。所以V_{c}即下文算法中的DISPLAY (UniformCount/i)

3.1自适应马尔科夫链蒙特卡罗方法

MCMC方法的一个困难就是最优突变幅度的选择,某个突变幅度很难适应所有的场景。自适应MCMC方法就提供了一种通过我们采样得到的重要性函数来自动的调整突变幅度的策略。

这里使用的是它的另外一种形式: controlled Markov chain Monte Carlo method。它的核心思想就是通过一个可自动适应的参数来调整要本的突变,并使得全部突变样本的平均接受率维持在某个最优值附近。

\theta_{i+1}=\theta{i}+\gamma_{i}(A_{i}-A^{*})

这个公式对应下文公式中的MutationSize ← MutationSize+(R−0.234)/Mutated,\theta_{i}对应MutationSize,Ai为一直到i个样本的接受率,Ai对应下文算法中的R ← Accepted/Mutated,而【A*】是目标接收率,一般为0.234,该接受率在大部分场景下的效果都很好。\gamma_{i}=\frac{1}{i}    \theta_{1}=1

2.4突变样本增加值

每个突变样本的改变值由下式决定:

\delta u=sin(2\xi _{0}-1)\xi _{1}^{\frac{1}{\theta_{i}}+1}

其中,\theta_{i}是第i个马尔科夫链的自适应突变值,突变值是一个在整个采样过程中保持的全局值。\xi _{0}\xi _{1}是【0,1】上的均匀随机数。

接受率也很容易计算,即\theta_{i+1}=\theta{i}+\gamma_{i}(A_{i}-A^{*}),也就意味着当这个突变路径是可见的时候这次突变就被接受了,和现有的MCMC相比,我们不需要再产生一个随机数来决定是否接受这次突变。

这个方程背后的思想是,如果接受率过大(A_{i}-A^{*})>0,意味着突变值过小,那么我们就要增加突变值,反之亦然。

3.1算法

整个过程算法如上,我们首先生成一条可见的路径。接着,进行NumTotalPhotons次迭代,每次迭代我们都首先生成一个UniformPath,如果该路径可见,那么r(\vec{u_{I}},\vec{u_{F}})=V(\vec{u_{I}})=1,我们就替换掉当前的路径,如果不可见,r(\vec{u_{I}},\vec{u_{F}})=V(\vec{u_{I}})=0,我们就进行正常的突变。

对于突变过程,我们根据当前路径生成一条潜在路径,上文已知接受率其实就等于V(\vec{u}),所以如果该潜在路径可见得话,就替换掉当前路径。

不论是否突变成功,该算法都会自适应的调整突变值。

3.2实现

整体来说该算法还是比较容易的,和PBRT现有的SPPM相比,我们仅需要拓展Trace photons and accumulate contributions部分。代码如下:

【实现代码存在错误,以下全部废掉,有空再拾起来改正】

REFERENCES:

1.Hachisuka, T., and H. W. Jensen. Robust adaptive photon tracing using photon path visibility. ACM Transactions on Graphics 30 (5), 114:1–114:11.
2.Physically Based Rendring :From Theory To Implementation
3.全局光照技术:从离线到实时渲染
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值