这里提到了我们要计算后面的积分结果的时候,会用到n=v=r的假设,这种近似是更大的不精确的来源。所以我们前面提到split sum里面的cos西塔的变化,其实就是为了获得更好的结果。

这里可以看知乎文章:深入理解 PBR/基于图像照明 (IBL) - 知乎

这里引入了一篇新的论文:

因为是均匀采样,所以概率是p=1/(beta-alpha) 按照公式,就是(1)

直接分析1,那么周期T=(beta-alpha)/ N 。

这里我们先回忆下之前提到的知识:、

这里首先要参考:连续时间信号的采样 - 知乎

但这里我也没理解PBRT原文里面的那个T怎么来的。暂且按下不表。

回到论文:

因为是均匀采样,所以T自然是(beta-alpha)/N

要完美重建信号我们之前已经学习过了。原始信号是g,我们要计算这个g的积分。因为某些原因,导致这个积分无法直接被算出来,于是我们通过采样得到gs,根据采样定理,我们可以将采样后的信号和sinc函数进行卷积,这样就得到了g^. 最后我们再对这个新的g^进行积分计算。这里要注意,采样的信号gs是离散的,它和sinc函数卷积之后,是离散卷积,得到的依然是离散的,而最后做积分,其实就是把所有离散信号求和的一个过程。也就是说,最终这个连续信号的积分被我们通过采样的方式以离散形式的积分给算了出来。

考虑原始信号x(t),采样使用一堆脉冲函数进行乘积:

然后还要和sinc函数进行卷积。

参考上面,X(t)=积分求和x(t')冲击函数(t'-nT) sinc(t - t') dt'

=求和积分x(t')冲击函数(t'-nT) sinc(t - t') dt'

所以卷积结果为:f(t) = 求和x(nT)sinc(t - nT)

参考:彻底搞懂傅里叶变换之实用干货分享(四)-离散傅里叶变换(DFT) - 知乎​​​​​

傅里叶系列(三)离散傅里叶变换(DFT) - 知乎

《傅里叶光学(九)》 信号采样与重建 - 知乎

所以重点在于,在计算机系统中,采样个数是有限的,然后我们可以进行周期延拓变成周期信号。

然后再进行傅里叶变换,得到的也是离散的频率。虽然有无穷多个频率,但因为是周期的,所以只需要观察我们采样的那N个采样点内部的周期的频率即可。

最后第三步:

因为我们最终要做的是对g(u)的积分,所以这里可以知道,取这个信号的积分实际就是取他傅里叶变换的直流分量。

这里要将原始信号先过滤,频域里乘积,也就是时域里的卷积,算出g'(u)

然后,要将预过滤和采样结合成一个积分。卷积的定义如下:

这里要注意的是ui,卷积完毕之后,将ui带入,那么得到的就是过滤后的采样结果。

我们要首先进行一次滤波,那么原始信号g和h进行卷积,卷积之后再采样,得到新的gs.

这里要注意,原始信号如果是离散的,那么就是离散卷积,后面采样也是离散的。

这里非常巧妙,前面我们直接从均匀采样的蒙特卡洛积分联想到傅里叶变换的关系。

对原始信号和脉冲信号进行乘积,得到采样的结果,也就是频域里的卷积,然后在和sinc函数卷积,就可以还原出原始信号。

而变成重要性采样后,我们利用换元法,这时候的x=P-1(u),带入积分式子。

dx = dP-1(u), 也就是P-1(u)求导du,因为P是pdf的积分,所以它的求导也就是pdf本身,

不过这里是反函数,根据反函数求导法则,他是原始函数导数的倒数,所以得出上面的式子。具体证明参考:为什么反函数的导数等于原函数导数的倒数? - 知乎

这里要注意,对g(x)的直接积分,这时候x的分布为p(x), 此事u = P(x). x = P-1(u).先不考虑滤波,如果我们直接对g(x)进行均匀采样,那么得到的离散信号并不是我们想要的,不符合重要性采样原则,那么它经过和sinc卷积得到的最终公式:

如果你要求g(1),那么x带入1, f(nxs)就是你的一堆采样点,而nxs就是你采样的x坐标,代入求就行了。

这里其实我们就能看出问题,重要性采样他和我们平时用的均匀脉冲函数不是一个东西。我们还是希望在均匀脉冲函数下进行分析。于是我们看第二个积分:

被积函数变成了g(P-1(u))/p(P-1(u))  此时也是可以进行均匀采样,所以说明g/p的概率密度函数是均匀的。

所以,通过第一个重要性采样等价于通过第二个积分的均匀采样。

然后我们再通过换元x'=P-1(u')带入,则

g(x')/p(x'),而u' = P(x')   du' = p(x')dx',这样就得到了(2)

这里也很重要,再前面的基础上我们增加了一个滤波的过程。注意,我们把滤波和采样放到了一个公式里面,但实际操作是分开的,我们先滤波,再均匀采样。本来原始信号是g,现在我们得先把它变成g/p才行。同理,当我们转化到x’空间下的时候,我们要保持被积函数是g/p,这样后面的hp就是我们的新的滤波器。

先把渲染积分方程中的o给去掉,因为他是一个已知的常数。然后,它利用了brdf相关的重要性采样加l的预过滤来进行积分。基于两个假设,1.要算积分,li需要从环境中进行采样,可以通过mimap来高效过滤。而brdf,可以通过数学解析式直接采样,这里的英语not filtered需要结合前面的can not be efficicently filtered,所以是过滤不高效的意思。因为环境光照的频率接近无限,直接采样会有混叠。所以mipmap过滤下很高效。

brdf过滤的话,需要进行一个卷积的计算,积分计算结果比较复杂,不好弄。

而且mipmap其实也要注意生成算法,完全均匀的生成也不是一个很好的过滤器。

Mx表示单位球空间。

Mu表示单位圆空间。可以根据反演法,用Mu中的均匀抽样得出Mx的重要性抽样。

Ms,环境贴图的表示空间。例如一个Cubemap或者一个双抛物线map,他们和Mx相关联,

可以通过一个s=R-1(x)来联系,R的雅可比行列式记为r.

首先,我们将积分域从Mx变换到Mu.

这是前面得到的(2)

首先我们带入Mx到Mu的变换,

S=积分(l(x')f(x')/p(x')[h(ui-P(x'))p(x')]dx'

然后要从x'再换元成s'

已知ds = dR-1(x)

所以dx = dR(s) = r(s')ds',带入得:

后面用了一个近似,把f/p从积分移到外面,主要是为了让积分只和l相关。

近似效果好的理由如下:

1.积分域很小,半球相当于0到Π,在实数范围内很小。

2.f和p是成正比的函数。

同理,可见性也可以这么做,这来自另一篇论文“

GREEN P., KAUTZ J., DURAND F.: Effificient re-
flflectance and visibility approximations for environment map ren
dering. Comp. Graph. Forum 26, 2 (2007), 495–502.”

,目前不展开。

为了提高过滤效率,这里选择了一个粗糙的过滤器。

这里直接把s到u的P近似成这样。

这里来看下滤波器的实操,因为原始信号在计算机里也是离散的,所以最终会变成求和。采样多个信号,然后和滤波器函数乘积。所以,对于li来说,我们采样一堆li,然后和滤波器函数进行乘积求和,而未知数是ui,也就是我们的想要知道的原始信号的值。通过P将u和x联系到了一起。

这里采用的是均值滤波器,假定是一个0-1范围的均值滤波器,那么采样9次,就是0,1/8, 2/8,......

8/8. 那么我们取中间值,也就是4/8, 因为是均值滤波,所以求和f(n)/9,也就是相当于我们的Mipmap了。

y在理解这个之前,我们得明白离散卷积的含义。

可以参考这个:在定义卷积时为什么要对其中一个函数进行翻转? - 知乎

国外有个很好的线上课程也有讲。麻省理工学院公开课:信号与系统:模拟与数字信号处理-引言-网易公开课

所以,我们这里的离散卷积,

对于现在的时刻,当前的信号是f,而过于信号的影响是g

那么扩大到空间范围,当前的空间信号是f,其他空间对我的影响是g。

所以li(x')表示当前信号的影响,后面的prefilter是周围信号对他的影响。

这里的当前变量是x',x表示积分域是0-x。

f(0)表示0时刻的影响,g(x)表示衰减到x的时候,相乘一下。

f(1)表示1时刻的影响,g(x-1)表示衰减了x-1的时候了。以此类推。

同理,空间上,li(x')表示周围的某个信号的影响,而prefilter函数则是这些信号衰减后的系数。

原公式里面,x'=R(s')  u = P(x')

也就是说,周围信号和此信号的距离进行衰减后的影响的叠加。

而后面的p(x')r(s')都是雅可比行列式的值。

这里我们认为过滤是周围的各向同性采样的平均。所以,h(ui-P(x'))描述的应该是基于u距离的衰减系数。ui-P(x')就是距离,其中,ui表示当前正被观察的像素,而P(x')(也就是u)表示周围的像素

所以S=求和li(x') * h(ui-P(x')) p(x')r(s')

不过我们的原始信号是s,所以采样si,那么它和s的距离是si-ss

然后因为经过了两个雅可比矩阵变换,所以是(si-s)p(xi)r(si)。

所以ui-P(x') = (s-si)p(xi)r(si)

所以最后这个原始的积分项里面,整个prefilter可以看成是s-si

当然这是一个近似,不能这么单纯的线性变换,不过也正是因为这个近似,滤波器的形状并没有改变。

然后我们来看下实际操作:

Chapter 20. GPU-Based Importance Sampling | NVIDIA Developer

欧米伽s是 1/(NP)   对应公式里吗就是  1/(Npr)

欧米伽p就是w * h。 K是经验值,表示原始滤波器的一个范围。

在英伟达的原始文章里面的意图很简单,就是单纯的采样数越多用的mip等级越低。概率密度也是一样。但放到论文中的时候,其实需要考虑的东西是不一样的。本来的pdf函数,针对的是半球空间的,但我们如果是cubemap,那么实际上需要对pdf函数进行一个转化,也就是雅克比矩阵的值。虽然最终结果一样,但论文中更加严谨。

论文中,我们推导出来:

这是蒙特卡洛积分每次采样需要的完整公式,f是brdf函数,p是概率密度。这些都是已知的。

重点在于后面那个积分,也就是英伟达文章中的滤波器。离散的卷积相当于对于采样点的求和。

li(x')是采样点,hpr相当于求和的各个采样点的权重。这里的范围很重要,因为如果是半球都考虑,那么采样点应该是无数个,这里需要设定一个范围,也就是原始的box滤波器的范围。

box滤波器关联的是采样数N以及具体采样的范围。例如采样9个像素,那么这个box滤波器应该就是1/9.求和9次。 r其实是一个单纯的雅克比行列式的值,重点其实是p,对于半球分布,pdf越大的地方,那么最终这个warpper pre-filter的值就越大,那么本来是1/9,可能就变成了1/3,那么只需要采样3次,所以mip就更低了。所以我们就得出了最终的K/pr的结论,这里要注意,N并不是滤波卷积的采样数,而是蒙特卡洛积分的采样数,所以K/pr是一组。pr越大,说明pre filter越大,于是需要采样的数量就越少,最终也就导致了mip越低。而K是h的方位,如果K是4,那么实际h就是1/4,所以K越大,其实是h越小。同理。

PBR来龙去脉十一:IBL继续积分部分相关推荐

  1. PBR中引入IBL——漫反射篇

    文章目录 PBR中引入IBL--漫反射篇 IBL 分解渲染方程 irradiance map的生成和作用 irradiance map生成过程 环境纹理envTexture的格式 环境纹理envTex ...

  2. PBR中引入IBL——镜面反射篇

    文章目录 PBR中引入IBL--镜面反射篇 回顾上一篇:漫反射 镜面反射的计算思路 镜面反射部分方程的分解 生成预计算纹理 必要的预备知识 镜面波瓣 蒙特卡洛积分(Monte Carlo Integr ...

  3. PBR来龙去脉九:继续Unreal的IBL部分

    这里做了部分修改,将k = alpha / 2. 为了更符合GGX 看几个函数图像对比 函数图像绘制网站: https://www.desmos.com/calculator?lang=zh-CN h ...

  4. PBR来龙去脉九:IBL学习蒙特卡洛的基本概念

    这里要注意,ξ是0-1的均匀分布,那么假设i=2,那么p1 < ξ < p1 + p2 也就是1/6 < ξ <= 2/6 ,那么ξ刚好就映射到i=2的时候的概率.也就是离散概 ...

  5. Directx11进阶教程PBR(3)之IBL

    IBL IBL是 Image Based Lighting的缩写,也就是基于图像的光照,  把包围整个场景的图像看作是一个大型光源, 对物体着色产生了影响.在图形渲染中通常指的SkyBox, 用于IB ...

  6. PBR来龙去脉篇一:光和人眼感知颜色

    早期光照模型: 兰伯特,BlinnPhong光照模型. 缺点:油腻,塑料感很强. PBR第一步: 基于物理的渲染方法的第一步都是以精确的方式来量化光线. 辐射度学(radiometry)  光度学(p ...

  7. PBR来龙去脉篇三:一些知识储备

    同样,我们得知道一些重要的细节.首先,我们得知道哪些是假定的. 假定1.漫反射是均匀的. float DisneyDiffuse(Vector3 In, Vector3 Out) {float one ...

  8. 关于pbr中镜面IBL低差异序列中的 Van Der Corput 序列

    源代码是这样的,乍一看的很难的,但其实仔细去解剖还是很好理解的 float RadicalInverse_VdC(uint bits) {bits = (bits << 16u) | (b ...

  9. PBR来龙去脉篇八:开始推导G(1)

    先看这篇论文: Microfacet Models for Refraction through Rough Surfaces 这里需要仔细理解下,这里是直接给出了结果,除了我们常见的FDG,还有两个 ...

最新文章

  1. 《Python从小白到大牛》第4章 Python语法基础
  2. 解析Vue.js中的computed工作原理
  3. SpringCloud微服务架构,Spring Cloud 服务治理(Eureka,Consul,Nacos),Ribbon 客户端负载均衡,RestTemplate与OpenFeign实现远程调用
  4. 10月25日学习内容整理:数据操作:增加更新删除,单表查询操作
  5. Linux 用虚拟地址(逻辑地址)计算物理地址(十进制 十六进制)
  6. SAP License:Ecc6.0和R/3 有什么区别?
  7. 跨境电商ERP有哪些?
  8. LeetCode刷题(15)
  9. C++11中智能指针的原理、使用、实现
  10. Epicor 客制化 - 常用对象
  11. linux如何把文件导出到ftp,Linux如何利用ssh传送文件至FTP空间
  12. Android ToolBar修改返回按钮图标
  13. 两个自变量和一个因变量spss_多个自变量对一个因变量的影响(SPSS:协方差分析)...
  14. 小白入门知识图谱构建与应用
  15. springboot 调用方法事物_springboot中使用@Transactional注解事物不生效的坑
  16. Golang之自旋锁
  17. Android的绘画软件,可以画漫画的软件有那些?你们要的安卓绘画软件,拿走吧!...
  18. 软件构造(九) 面向复用的软件构造技术
  19. 2019年上半年网络安全态势报告
  20. Node.js:npm install时出错 check python checking for Python executable “python2“ in the PATH

热门文章

  1. 奇葩90后引领了哪些互联网潮流?
  2. c语言0x1234占两个字节,C语言考试必考知识点
  3. (转载)(官方)UE4--图像编程----着色器开发----HLSL 交叉编译器
  4. 工控安全PLC固件逆向一
  5. 程序员编程的专业名言
  6. 凸包问题-Graham-Scan算法-python实现
  7. Python爬虫:使用线程池快速下载视频
  8. 读《格鲁夫给经理人的第一课》
  9. 这家为AI for Science而生的新研究院,要让科研进入“安卓模式”
  10. pc_lint的用法转