Q139:PBRT-V3,Metropolis Light Transport (MLT)(16.4章节)

看这篇文章之前,可以先看看小编之前转载的一篇博文:
Metropolis Light Transport学习与实现

后文内容的结构不是“教程”样式的,而是个人完成初步学习之后对学习结果的简单总结样式。主要是对个人理解的沉淀。

一、概述

前面已经学过BDPT(Bidirectional Path Tracing, 双向路径追踪)。
BDPT的基本思路是:
1,对每个像素点进行多次采样;
2,每个采样点对应:一条CameraSubpth(含t个顶点);一条LightSubpath(含s个顶点);连接CameraSubpath和LightSubpath,则可能产生(t*s)条完整路径。
3,计算每一条完整路径的贡献。累加这(t*s)条完整路径的贡献作为当前像素点最终的颜色值。

BDPT中存在一个较为严重的效率问题:每个采样点对应的(t*s)条完整路径中的大部分完整路径的贡献可能是0。
MLT为了改善这个效率问题,采取了两个措施。
措施1:每个采样点只对应一条完整路径。
措施2:基于当前采样点进行Metropolis采样获得下一个采样点。(这个措施能够提高效率的前提是:“当前采样点”的那条完整路径上的贡献相对比较大。另外,有个默认假设:在贡献比较大的完整路径附近找到另一条完整路径的贡献也会比较大。)
(关于“Metropolis 采样”可以参考前面链接的转载博文,也可参考“Q137”中的3.3节)

关于MLT,咱先看一张示意图。

这里写图片描述
红色路径:是初始路径,即“当前路径”;(先不要管“当前路径”在Film上的采样点(红点)是怎么确定的,后面会有解释)。
(红色路径附近的)黑色路径:是红色路径经过small_step变异采样得到的。
(离红色路径较远的)绿色路径:是红色路径经过large_step变异采样得到的。

关于“small_step”和“large_step”即是“采样间距”。
如图中Film部分所示,对红色点进行小间距的Metropolis采样得到的是红色点附近的黑色点;对红色点进行大间距的Metropolis采样得到的是绿色点。
发现:在Metropolis采样中引入了“大间距”,只要给定一个初始采样点(红点),然后经过若干次“small_step”、“large_step”采样之后,足以完成对整个Film的采样。

虽然,只需要给定一个初始采样点,经过若干次Metropolis采样之后得到的后续采样点是分布在整个Film上的,但是,存在两个问题:
问题1:初始采样点唯一确定的话,风险是不是有点大呢?提供多个初始采样点,然后分别进行Metropolis采样,然后对结果进行加权,风险是不是小得多呢?
问题2:从示意图中可以看出,对初始路径进行Metropolis采样得到的后续路径(不管是黑色路径,还是绿色路径)的长度都是和初始路径的长度相同的。由初始路径的长度确定了后续采样采样路径的长度,明显欠妥。怎么弥补呢?提供多条不同长度的初始路径。

解决这两个问题的方案是:对多条不同长度的初始路径分别进行Metropolis采样,然后对结果进行加权。

考虑到MLT的默认假设:在贡献比较大的完整路径附近找到另一条完整路径的贡献也会比较大。
初始路径多了之后,带来另一个问题:
怎么在所有初始路径中选出贡献比较大的路径呢?

有木有觉得这个问题貌似和咱之前遇到过的某个问题比较相似呢?
是滴,那就是“怎么在所有光源中选出能量比较大的光源呢?”
参考Q137:PBRT-V3,各种采样(Sampling)之间的逻辑
中的“三、采样4,从所有光源中随机选取一个光源;”章节。

所以,同样,咱们将所有初始路径的贡献值添加到“一维阶梯分布”中。然后,对“一维阶梯分布”进行采样即可以比较大的概率选出贡献比较大的初始路径啦。

OK, 知道怎么选择初始路径之后,就可通过for循环反复对该“一维阶梯分布”进行采样,
每次得到一个初始路径,然后通过Metropolis采样产生新的路径(这里也有个循环,如示意图中红点附近有多个黑点,即进行了多次Metropolis采样),然后将新路径上的贡献累加到Film上对应采样点的颜色值上。
然后对“一维阶梯分布”进行下一次采样得到新的初始路径。循环……

一直在说“Metropolis采样”,那么“Metropolis采样”到底是怎么实现的呢???

二、Metropolis采样

从“宏观”(其实,也没多“宏观”)上来看,“Metropolis采样”作用的是路径。
正如MLT的默认假设:在贡献比较大的完整路径附近找到另一条完整路径的贡献也会比较大。我们要做的就是对“贡献比较大的完整路径”进行“Metropolis采样”,以便得到“另一条贡献比较大的完整路径”。
另外,如示意图所示,对“红色路径”进行“Metropolis采样”得到“黑色路径”。(当然,给“Metropolis采样”加入large_step后,对“红色路径”进行“Metropolis采样”还能得到“绿色路径”)

从“微观”上来看,“Metropolis采样”具体具体具体作用的路径上需要采样的点。
如示意图所示,对“红色路径”进行“Metropolis采样”得到“黑色路径”的过程是:对“红色路径”上所有需要采样的点都进行“Metropolis采样”得到新的采样点,新的采样点对应就是“黑色路径”。
“需要采样的点”,貌似不太好理解,听起来也怪怪的。简化一下,只考虑路径上的顶点吧。对“红色路径”进行“Metropolis采样”的过程可以简单理解为:
对“红色路径”对应的CameraSubpath、LightSubpath的顶点分别进行“Metropolis采样”。

“Metropolis采样”在PBRT-V3中对应的类是MLTSampler。

2.1 MLTSampler::rng

RNG是PBVT-V3的伪随机数发生器。参考:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值