Q122:PBRT-V3,提高Monte Carlo积分计算效率的方法——Russian Roulette和Splitting(13.7章节)

来源:互联网 发布:移动端网页聊天室源码 编辑:程序博客网 时间:2024/05/30 19:34

提高Monte Carlo积分计算效率的本质:
减少那些对结果贡献小的采样点的数目!

特别声明:“提高效率”的前提是不能影响计算结果的精确度。

一、Russian Roulette

以“路径形式的光传播方程”为例来进行说明。
方程截图如下:
这里写图片描述
这个结果是由“无数条长度分别为1、2、3、……的路径上返回的光”累加而成。

咱用beta(n)表示长度为n的路径上返回光的比例(或者说“效率”吧);Le(n)表示长度为n的路径最终打到的光源的光的辐射率。
这样,长度为n的路径上贡献的光P(n)=beta(n)*Le(n)

根据能量守恒:路径的长度越长,该路径上返回的光(能量)越少(即,对计算结果的贡献越小)。
即:beta(1)>beta(2)>beta(3)>……>beta(n-1)>beta(n)>……

这个时候,就考虑“扔掉”那些贡献小的路径。当然,不能直接“扔掉”,这样肯定会影响计算结果。咱得以一种“不会影响计算结的”方式来扔掉。

假设咱想“扔掉”长度>=n的路径。

Russian Roulette方法是怎么做的呢?

这个长度>=n的路径要不要扔掉,咱给这件事情设定个概率q:
有q的概率,扔掉,P(n)=0;
有(1-q)的概率,不扔掉,P(n)=P(n)/(1-q);

既然是想扔掉,那么q的值应该相对比较大嘛(不然怎么会有这种想法呢?)。
那么怎么设定这个q呢?
前面,不是提到是因为beta(n)很小了,所以才有“扔掉”的想法啦。
那么,就选q=1-beta(n)。
(这样,在beta(n)很小的情况下,对应路径被扔掉的可能性就比较大啦,从而提高了计算效率)

Russian Roulette方法,设事件为F;称q为“终止概率”;终止时赋值c(前面例子中c=0);未终止时赋值(F-qc)/(1-q),使用Russian Roulette方法之后的事件为F’。即:
这里写图片描述

这里写图片描述

Russian Roulette方法可以提高计算效率,但是不改变结果的“期望”。

二、Splitting

Russian Roulette减少了贡献小的成分的计算(即,减少相应的采样数目)。

Splitting的本质也是一样的,但是针对的使用情形不一样。

针对这中积分:
这里写图片描述

这里写图片描述

对积分的各个维度分别(Splitting)采样。

原创粉丝点击