Q119:PBRT-V3,“复合重要性采样”(13.10章节)
来源:互联网 发布:vevo lazr软件下载 编辑:程序博客网 时间:2024/05/16 18:02
之前在学习《Ray Tracing From The Ground Up》时,有总结过“蒙特·卡罗积分”:
Q73:蒙特•卡罗积分(Monte Carlo Integration)
后文内容,主要参考PBRT-V3的13.10章节。
一、重要性采样
对于积分:
Monte Carlo estimator:
“重要性采样”就是根据f(x)的值来调整p(x)的概率分布。
也就是说:f(x)值大的地方,就多采几个点;f(x)值小的地方,就少采几个点。
(f(x)值大的地方说明:这个地方的x对积分结果的贡献大,所以要多采几个点)
p(x)的概率分布和f(x)的值越是接近,Monte Carlo estimator计算的结果越精确。
如果不是“重要性采样”,会怎么样呢?
不是“重要性采样”,也就是说:
case 1,f(x)值大的地方,p(x)的概率分布小;
case 2,f(x)值小的地方,p(x)的概率分布大;
回头看看Monte Carlo estimator,累加的单项是:f(x)/g(x)
“重要性采样”的情况是:大/大+小/小
不是“重要性采样”的情况是:大/小+小/大
问题来了,“大/小”会得到一个很大的值,使得整体的方差增大;
“小/大”会得到一个很小的值,也使得整体的方差增大;
前面的内容只是为了说明一点:
p(x)的概率分布和f(x)的值差异越小,计算的结果越精确;
p(x)的概率分布和f(x)的值差异越大,计算的结果越不精确;
二、复合“重要性采样”
对于这种积分:
怎么采样呢?
f(x)和g(x)都有各自的“重要性采样”对应的概率分布。
f(x)g(x)是用哪一个对应的概率分布进行采样呢?
(假设f(x)g(x)乘积的结果不便采样)
不管用哪一个对应的概率分布,对另一个来说可能都不是“重要性采样”,所以,都会导致计算结果方差增大。
在这种情况下,比较容易想到:
分别用f(x)、g(x)对应的概率分布采样求出两个值,然后对这两个值求平均。
(不好!因为“两个值”的方差都很大,“求平均”并不能消除方差)
“复合重要性采样”的策略是:
不是“分别用f(x)、g(x)对应的概率分布采样求出两个值,然后对这两个值求平均。”
而是“在分别用f(x)、g(x)对应的概率分布采样求积分的过程中,分别乘以各自的权系数”。
权系数函数怎么确定呢?
有个被称为“balance heuristic”的函数是个不错的选择:
这个函数“不错”的原因是:
“分母”的式子“所有可能分子”的累加。
这样,一方面保证所有权系数的和为1;另一方面每一项中都考虑了所有其他项的概率分布。
将这个函数代入前面“复合重要性采样”的式子的第一项:
只要f(x)、g(x)分别对应各自的“重要性采样”,即:
f(x)大,pf(x)大;f(x)小,pf(x)小;g(x)大,pg(x)大;g(x)小,pg(x)小;
这样,前面的式子的值只有如下几种情况:
(大*大)/(大+大)=大/大;(大*小)/(大+小)=大/大(小/小);(小*大)/(小+大)=小/小(大/大);(小*小)/(小+小)=小/小;
可以看出,没有出现增大方差的情况:
大/小;小/大;
所以,最终计算的结果是比较精确的。
pbrt-v3中的代码实现:
inline Float BalanceHeuristic(int nf, Float fPdf, int ng, Float gPdf) { return (nf * fPdf) / (nf * fPdf + ng * gPdf);}
pbrt-v3中实际使用的power heuristic(加上一个指数,对减小方差效果更好)
Veach这个哥们,根据经验发现指数=2时效果不错。
所以,在pbrt-v3中也将该指数固定为2。相关代码:
inline Float PowerHeuristic(int nf, Float fPdf, int ng, Float gPdf) { Float f = nf * fPdf, g = ng * gPdf; return (f * f) / (f * f + g * g);}
三、复合“重要性采样”的应用
pbrt-v3中的DirectLightingIntegrator的实现是基于“复合重要性采样”的。
如果只对f(即BSDF)进行“重要性采样”:
当遇到Ld(即Light)是delta光源(点光源只有一个点发光;平行光光源只有一个发光)时,
大部分(大概率)情况下采样点对应光线的radiance都会是0(小值),
即出现“大/小”的情况,所以计算结果方差很大。
如果只对Ld(即Light)进行“重要性采样”:
当遇到f(即BSDF)包含镜面反射时,
也会出现,
大部分(大概率)情况下采样点对应光线的radiance都会是0(小值),
即出现“大/小”的情况,所以计算结果方差很大。
综上,可能出现“意外”的情况有:
1,对BSDF采样时,遇到“小”光源,效果不好;2,对Light采样时,遇到“光滑”表面,效果不好;
借用PBRT-V3中14.3章节的图来说明“复合重要性采样”:
对BSDF进行重要性采样时,遇到“大”光源,效果还可以:对比a、c图中的绿色框标注部分。对Light进行重要性采样时,遇到“粗糙”表面,效果还可以:对比b、c图中的红色框标注部分。
对BSDF和Light进行“复合重要性采样”时,效果最好!!!!!!!!
另外,分别采样时,针对的采样对象可以不一样。
比如:
对Light采样时,是针对“面积”;
对BSDF采样时,是针对“立体角”。
- Q119:PBRT-V3,“复合重要性采样”(13.10章节)
- Q133:PBRT-V3,BSSRDF的采样(15.4章节)
- Q130:PBRT-V3,非均匀介质的采样(11.3.3章节、15.2.2章节)
- Q129:PBRT-V3,均匀介质的采样(15.2.1章节)
- Q120:PBRT-V3,“直接光照”积分器(14.3章节)
- Q124:PBRT-V3,“路径追踪”积分器(14.5章节)
- Q139:PBRT-V3,Metropolis Light Transport (MLT)(16.4章节)
- Q137:PBRT-V3,各种采样(Sampling)之间的逻辑
- Q120:PBRT-V3,“直接光照”积分器(14.3章节)(翻译不下去了)
- Q121:PBRT-V3,光传播方程(The Light Transport Equation)(14.4章节)
- Q134:PBRT-V3,次表面散射(Subsurface Scattering)(15.5章节)
- Q135:PBRT-V3,随机渐进光子映射(Stochastic Progressive Photon Mapping)(16.2章节)
- Q136:PBRT-V3,双向路径追踪(Bidirectional Path Tracing)(16.3章节)
- Q138:PBRT-V3,伪随机数发生器(pseudo-random number generator,RNG)(A.1.2章节)
- Q128:PBRT-V3,“体渲染”积分器的“传播方程”(15.1章节)
- Q141:PBRT-V3,交点处各种微分的求解(球面,3.2章节)
- Q142:PBRT-V3,交点处各种微分的求解(三角形,3.6章节)
- Q132:PBRT-V3,BSSRDF(双向散射表面反射分布函数)(5.6.2章节、11.4章节)
- 关于eclipse解决java前台往后台传值乱码问题
- 仿新版QQ底部导航栏动态拖动按钮
- 【Photoshop】Photoshop 64Bit与Camera Raw安装包
- DescriptionResourcePathLocationType AbsRequestEvent cannot be resolved to a typeLogViewRequ
- java 判断两个数是否异号
- Q119:PBRT-V3,“复合重要性采样”(13.10章节)
- css优先级
- 经常被问的问题-jvm优化
- springMVC 多文件上传
- 【二叉树】层次遍历
- 4----编程判断是某年的第几天
- Java基础知识(不定期更新)
- Java基础2
- ubuntu中管理用户和用户组