文章内容是小编个人当前对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 采样不是那么特别非常常见,所以此处没有将它总结进来。

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

  1. SAP库存表之间的逻辑关系

    SAP库存表之间的逻辑关系 转载于SAP学习门户网,原文链接: http://www.sap6.com/learn/mm/073504302015/3370.html 当前库存: 一般保存在 MARD ...

  2. python使用缩进来体现代码之间的逻辑关系-python使用缩进来体现代码之间的逻辑关系吗?...

    对,python使用缩进来体现代码之间的逻辑关系,对缩进的要求非常严格.Python语言通过缩进来组织代码块,这是Python的强制要求.在代码前放置空格来缩进语句即可创建语句块,语句块中的每行必须是 ...

  3. python语言采用严格的缩进来体现语句的逻辑关系_Python语言通过( )来体现语句之间的逻辑关系...

    Python语言通过( )来体现语句之间的逻辑关系 答:缩进 我们要坚定不移地走中国特色社会主义道路 答:√ 即在应用文正文的结尾处点名文章主题,也被称为"卒章显志" 答:篇末点题 ...

  4. python使用缩进来体现-python使用缩进来体现代码之间的逻辑关系吗?

    对,python使用缩进来体现代码之间的逻辑关系,对缩进的要求非常严格.Python语言通过缩进来组织代码块,这是Python的强制要求.在代码前放置空格来缩进语句即可创建语句块,语句块中的每行必须是 ...

  5. python中使用缩进来体现代码之间的逻辑关系_Python使用缩进来体现代码之间的逻辑关系....

    Python使用缩进来体现代码之间的逻辑关系. 答:对 相关系数等于零表明两变量 ( ) 答:不存在线性相关关系 : PEST模型分析中,P代表什么意思() 答:政治 生命伦理秩序的发生与演变,具有极 ...

  6. python语言通过()来体现语句逻辑关系_【单选题】Python语言通过( )来体现语句之间的逻辑关系。...

    [单选题]Python语言通过( )来体现语句之间的逻辑关系. 更多相关问题 根据<民事诉讼法>的规定,当事人可以委托诉讼代理人()A.1人B.2人C.1-2人D.2-3人 根据我国< ...

  7. 组合与继承有什么共同点和差异?通过组合生成的类与被组合的类之间的逻辑关系是什么?继承呢?

    组合与继承有什么共同点和差异?通过组合生成的类与被组合的类之间的逻辑关系是什么?继承呢? 组合与继承的?共同点: 都是能够使用已经封装好的类. 组合与继承的差异: 通过组合生成的类一旦消失,被组合生成 ...

  8. 重采样、下采样、上采样三者之间的关系

    重采样主要是分为上采样和下采样,在进行采样的过程中,需要注意采样的倍率的问题,并不是可以随意的改变采样率的大小的,根据采样定理:在进行模拟/数字信号的转换过程中,当采样频率大于信号中最高频率的2倍时, ...

  9. 数据采集中的采样率、缓冲区大小以及,每通道采样数之间的关系

    采样率:每秒钟才多少次 每通道采样数:指的是每次从通道读取的数据长度,其实是从buffer里面读取.如果每次读的太少,读取时间间隔长那么buffer数据堆积会导致溢出.因此buffer size应该大 ...

最新文章

  1. 【转】C/C++中的日期和时间
  2. B站疯传!拿走不谢!最全面的JAVA面试材料!完整版开放下载,叫我好人!
  3. 构造方法,this,super关键字
  4. 输出两个文件中不同/相同的行
  5. Ubuntu增加一个用户并给普通用户赋予root权限的方法
  6. jQuery 所有版本在线引用
  7. 如何提升 CSS 性能的小知识
  8. Redmine管理项目1-自定义属性
  9. swagger如何屏蔽某些接口,不对外公开--使用@ApiIgnore
  10. 传统蒙文字体_蒙文字体下载
  11. 通俗易懂的方式讲解最大流和最小割问题
  12. 如何成为一个区块链开发人员_关于成为远程开发人员的思考
  13. pwnable kr 之 passcode
  14. 编译镜像(映像).img文件
  15. 小白重装系统教程_小白一键重装系统win8教程
  16. 什么是粗粒度和细粒度权限
  17. 【新书推荐】图神经网络导论,清华大学刘知远老师著作
  18. mysql Access denied; you need (at least one of) the SUPER privilege(s) for this operation
  19. 压力下铜氧化物超导体的2D-3D超导态跃变研究获进展
  20. drools规则引擎的基本使用和原理介绍

热门文章

  1. 遍历排列的实现——VB2005
  2. [WCF编程]8.服务实例的生命周期
  3. MongoDB聚合(二)
  4. 判断鼠标向右或向左滑动,响应不同的事件
  5. Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(7)
  6. zabbix配置飞信报警
  7. 程序员面试金典——17.5珠玑妙算
  8. 【深度学习】深度学习分类与模型评估
  9. KMP原理及使用的再总结
  10. Linux系统瓶颈分析(经典)