Q137:PBRT-V3,各种采样(Sampling)之间的逻辑
文章内容是小编个人当前对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)之间的逻辑相关推荐
- SAP库存表之间的逻辑关系
SAP库存表之间的逻辑关系 转载于SAP学习门户网,原文链接: http://www.sap6.com/learn/mm/073504302015/3370.html 当前库存: 一般保存在 MARD ...
- python使用缩进来体现代码之间的逻辑关系-python使用缩进来体现代码之间的逻辑关系吗?...
对,python使用缩进来体现代码之间的逻辑关系,对缩进的要求非常严格.Python语言通过缩进来组织代码块,这是Python的强制要求.在代码前放置空格来缩进语句即可创建语句块,语句块中的每行必须是 ...
- python语言采用严格的缩进来体现语句的逻辑关系_Python语言通过( )来体现语句之间的逻辑关系...
Python语言通过( )来体现语句之间的逻辑关系 答:缩进 我们要坚定不移地走中国特色社会主义道路 答:√ 即在应用文正文的结尾处点名文章主题,也被称为"卒章显志" 答:篇末点题 ...
- python使用缩进来体现-python使用缩进来体现代码之间的逻辑关系吗?
对,python使用缩进来体现代码之间的逻辑关系,对缩进的要求非常严格.Python语言通过缩进来组织代码块,这是Python的强制要求.在代码前放置空格来缩进语句即可创建语句块,语句块中的每行必须是 ...
- python中使用缩进来体现代码之间的逻辑关系_Python使用缩进来体现代码之间的逻辑关系....
Python使用缩进来体现代码之间的逻辑关系. 答:对 相关系数等于零表明两变量 ( ) 答:不存在线性相关关系 : PEST模型分析中,P代表什么意思() 答:政治 生命伦理秩序的发生与演变,具有极 ...
- python语言通过()来体现语句逻辑关系_【单选题】Python语言通过( )来体现语句之间的逻辑关系。...
[单选题]Python语言通过( )来体现语句之间的逻辑关系. 更多相关问题 根据<民事诉讼法>的规定,当事人可以委托诉讼代理人()A.1人B.2人C.1-2人D.2-3人 根据我国< ...
- 组合与继承有什么共同点和差异?通过组合生成的类与被组合的类之间的逻辑关系是什么?继承呢?
组合与继承有什么共同点和差异?通过组合生成的类与被组合的类之间的逻辑关系是什么?继承呢? 组合与继承的?共同点: 都是能够使用已经封装好的类. 组合与继承的差异: 通过组合生成的类一旦消失,被组合生成 ...
- 重采样、下采样、上采样三者之间的关系
重采样主要是分为上采样和下采样,在进行采样的过程中,需要注意采样的倍率的问题,并不是可以随意的改变采样率的大小的,根据采样定理:在进行模拟/数字信号的转换过程中,当采样频率大于信号中最高频率的2倍时, ...
- 数据采集中的采样率、缓冲区大小以及,每通道采样数之间的关系
采样率:每秒钟才多少次 每通道采样数:指的是每次从通道读取的数据长度,其实是从buffer里面读取.如果每次读的太少,读取时间间隔长那么buffer数据堆积会导致溢出.因此buffer size应该大 ...
最新文章
- 【转】C/C++中的日期和时间
- B站疯传!拿走不谢!最全面的JAVA面试材料!完整版开放下载,叫我好人!
- 构造方法,this,super关键字
- 输出两个文件中不同/相同的行
- Ubuntu增加一个用户并给普通用户赋予root权限的方法
- jQuery 所有版本在线引用
- 如何提升 CSS 性能的小知识
- Redmine管理项目1-自定义属性
- swagger如何屏蔽某些接口,不对外公开--使用@ApiIgnore
- 传统蒙文字体_蒙文字体下载
- 通俗易懂的方式讲解最大流和最小割问题
- 如何成为一个区块链开发人员_关于成为远程开发人员的思考
- pwnable kr 之 passcode
- 编译镜像(映像).img文件
- 小白重装系统教程_小白一键重装系统win8教程
- 什么是粗粒度和细粒度权限
- 【新书推荐】图神经网络导论,清华大学刘知远老师著作
- mysql Access denied; you need (at least one of) the SUPER privilege(s) for this operation
- 压力下铜氧化物超导体的2D-3D超导态跃变研究获进展
- drools规则引擎的基本使用和原理介绍