Q137:PBRT-V3,各种采样(Sampling)之间的逻辑

来源:互联网 发布:windows屏幕水印 编辑:程序博客网 时间:2024/05/16 16:15

文章内容是小编个人当前对PBRT-V3的理解,可能和实际有偏差。

一、概述

PBRT-V3中最直观最常用到采样的地方有:
采样0,对单位正方形进行采样;
采样1,对Film上的每个像素点进行多次采样;
采样2,对交点处的BSDF进行采样;
采样3,对具体光源进行采样;
采样4,从所有光源中随机选取一个光源;

另外一个不怎么常用到的采样是:
采样5,Metropolis Sampling(这个是用在MLT Integrator中)

二、采样0,对单位正方形进行采样

对单位正方形进行采样,是为了从单位正方形上获取一个采样点。

这里写图片描述
“单位正方形采样”的方式很多,如上图所示的包含三种采样方式:随机采样;均匀分层采样;抖动分层采样。
按照PBRT-V3上介绍的相关采样方式有:RandomSampler, StratifiedSampler, HaltonSampler, ZeroTwoSequenceSampler, MaxMinDistSampler, SobolSampler, ……
(不同的采样方式之间的区别在于:采样点在单位正方形上的分布不一样)。

二、采样1,采样2,采样3

采样1,对Film上的每个像素点进行多次采样;
采样2,对交点处的BSDF进行采样;
采样3,对具体光源进行采样;

涉及这三种采样的情况如下方图示:

这里写图片描述

2.1 采样1,对Film上的每个像素点进行多次采样

这个是给定一个像素点位置,然后在该像素点所在的单位正方形进行采样,获取采样点。(即:“采样1”是直接使用“采样0”)

相关代码截图:

这里写图片描述

然后,连接相机位置和Film上采样点的位置,生成一条光线进入场景。

2.2 采样2,采样3

采样2,对交点处的BSDF进行采样;
采样3,对具体光源进行采样;

光线进入场景后,和场景中的物体发生碰撞,产生交点。
从这个交点返回给相机的光怎么计算呢?渲染方程:
这里写图片描述
其中,“f”就是BSDF的采样值;“L”就是光源的采样值。
求解这个积分的方式是通过Monte Carlo积分。
为了使求解过程快速收敛,求解结果(相对)精确,则要求按照“重要性采样”获取采样点。
如果“f”和“L”都需要采样的话,那就是“复合重要性采样”。
参考:Q119:PBRT-V3,“复合重要性采样”(13.10章节)

关于“复合重要性采样”后续参考如上链接即可。
咱先看看怎么分别对“f”和“L”进行“重要性采样”。

2.2.1 采样2,对交点处的BSDF进行采样

对“f”(即BSDF)进行重要性采样,也就是对以交点为球心的单位上半球进行重要性采样。
其实,对单位上半球进行采样的方式,只需要将“采样0”中对单位正方形的采样点直接映射过来即可。
但是,怎么体现“重要性”呢?
考虑到渲染方程中的这里写图片描述,明显“重要性”有这个cos值决定。
所以,对“f”的重要性采样是:将“采样0”中对单位正方形的采样点按照cos值的分布映射到上半球上即可。

2.2.2 采样3,对具体光源进行采样

考虑到面积光源可能是各种几何形状,则需要针对具体的几何形状进行采样。
怎么体现“重要性”呢?
和“2.2.1”中一样,重要性通过cos值(当然,有的几何体并没有直接相关的cos值,另做考虑吧。但是,一定是要体现“重要性”的)。
所以,
具体做法和“2.2.1”类似:将“采样0”中对单位正方形的采样点按照cos值的分布映射到相应的几何体上即可。

三、采样4,从所有光源中随机选取一个光源;

从所有光源中采样出一个光源,也得体现“重要性”。
怎么体现这个“重要性”呢?
根据光源的能量大小进行采样。即,能量大的光源被采样到的概率大;能量小的光源被采样到的概率小。
这就涉及到了一个通用而又强大的知识点啦:根据给定概率分布进行采样。(这个就是PBRT-V3中13.3章节的内容)

插播一句:
“采样0”是“均匀采样”(这里的“均匀”指的是采样点出现的概率相等,而不是空间分布均匀);
“采样1”和“采样2”都是通过“采样0”映射来得到采样点。如果采样过程体现了“重要性”,则采样点出现的概率和cos值相关。如果采样过程没有体现“重要性”,则采样点出现的概率是均等的(即为“均匀采样”)

“根据给定概率分布进行采样”,明显就不是“均匀采样”啦,而且采样点出现的概率不像“采样1”、“采样2”中只是简单地和cos值相关。
对于“根据给定概率分布进行采样”,采样点出现的概率要复杂得多,所有采样点出现的概率必须符合给定的概率分布。

根据给定概率分布获取采样的方法:
法一,the inversion method (反演法);
法二,the rejection method (拒绝法);
法三,Metropolis sampling;

3.1 法一,the inversion method (反演法)

反演法的步骤:

这里写图片描述

第一步:计算给定概率分布的“累积概率分布”(也就是求给定概率分布的积分);
第二步:计算“累积概率分布”的反函数;
第三步:获取一个均匀分布的随机数(可以通过“采样0”来获取。“采样0”提供的单位正方形上的二维点。这里需要的是更为简单的一维随机数,可以通过“采样0”中的Get1D()获取)
第四步:将均匀分布的随机数代入累积概率分布的反函数,即获得给定概率分布的一个采样点。(将该采样点的坐标代入原概率分布,可以求得该采样点出现的概率)。

从这些求解步骤中发现,可以用反演法来对某概率分布进行采样的前提是:
1,该概率分布的积分可求(容易求);
2,该概率分布的积分的反函数可求(容易求);

当然,会有很多概率分布函数并不能满足如上这两个条件。
先不管,咱先看看哪些常见的概率分布是满足这两个条件的,可以用反演法来进行采样。
分布1:Power Distribution(这里写图片描述);
分布2:Exponential Distribution(这里写图片描述);
分布3:Piecewise-Constant 1D Functions(这里写图片描述);
对于这三种分布的具体计算过程,此处不表。
值得指出的是:
第一点:所有光源的能量的分布符合“分布3”(一维阶梯分布),所以可以用反演法来对光源的能量分布进行采样,从而实现“从所有光源中随机获取一个光源”(能量大的光源被采样到的概率大;能量小的光源被采样到的概率小);
第二点:对于“分布2”,其实是包含“正态分布”的。后续Metropolis采样过程的“变异函数”一般选择的就是“正态分布”函数。

3.2 法二,the rejection method (拒绝法)

前面已经提到,“反演法”对概率分布函数有两个条件:
1,该概率分布的积分可求(容易求);
2,该概率分布的积分的反函数可求(容易求);

对于不满足这两个条件的概率分布函数,应该怎么进行采样呢?

可以考虑“拒绝法”,对应PBRT-V3中13.3.2章节。

由于这种方法简单粗暴、效率不高,此处不表。

3.3 法三,Metropolis sampling

前面已经提到,“反演法”对概率分布函数有两个条件:
1,该概率分布的积分可求(容易求);
2,该概率分布的积分的反函数可求(容易求);

对于不满足这两个条件的概率分布函数,应该怎么进行采样呢?

可以使用“3.2”所提的“拒绝法”。但是,“拒绝法”的效率确实不高,所以直接被否定啦。
咱还可以使用“Metropolis采样”(对应PBRT-V3中的13.4章节)。

对于“Metropolis采样”,咱先简单说明一下它是一个怎么的存在。
在此之前的所有的采样都是“独立采样”,即:任何两个采样点之间是没有任何关系的、是相互独立的。
“Metropolis采样”是“关联采样”,后一个采样点是和前一个采样点关联的。

PBRT-V3中讲述的“Metropolis采样”的算法是“Metropolis-Hastings算法”。即:
这里写图片描述
第一步:给定初始采样点X0,将X0当做当前采样点X;
第二步:对X进行变异得到“建议采样点”X’;(这个变异函数mutate()可以是任何函数,PBRT-V3中后续再介绍MLT Integrator时,使用的是正态分布函数。即,以X为中心,在X附近按照正态分布进行采样获得X’(参考“3.1”中的“分布2”)。
第三步:根据当前采样点X和建议采样点X’的函数值计算这个建议采样点X’被接受的可能性a;
第四步:(像“3.1”中一样)获取一个均匀分布的随机数。如果a比这个随机数大,则说明这次的建议采样点X’可以被接受(即,将X’作为下一次变异的X。相当于产生了一个新的采样点);如果a不比这个随机数大,则说明这次的建议采样点X’不可以被接受(即,下一次变异的X还是这一次的X。相当于这次采样失败,没有新的采样点产生)

有木有发现?
Metropolis采样过程中只需要求概率分布中某点的概率(函数值)(第三步中),不需要求概率分布的积分,更不需要求概率分布积分的反函数。

另外,PBRT-V3中,Metropolis采样只在MLT Integrator中用到。

四、总结

总结截图如下:

这里写图片描述
图中“均匀采样”指的是“对单位正方形的采样”。

Metropolis 采样不是那么特别非常常见,所以此处没有将它总结进来。

原创粉丝点击