写在前面的个人总结
回顾自己学图形学时,总结起来大致遇到三大难关,第一个难关是对“光”的理解(第五章,第八章的内容),涉及到光通量,光照强度,辐射率等概念,以及什么是BRDF,反射的积分公式;第二个难关是对“采样”的理解(第七章,第十章内容),为什么要采样,采样背后的信号处理的理论基础,纹理的采样速率如何确定等等问题。而第三大难关,就是本章要介绍的蒙特卡洛积分。涉及的知识主要是概率论,如何用抽样来求解积分问题。通过了“三大难关”后,我觉得图形学往后的学习就相对平坦多了。所以也可以说这是最后一个拦路虎了,加油!
什么是蒙特卡洛,听着名字感觉很高大上,它代表一种用随机抽样来得到某个问题的近似的思想。通常都会用一个简单的例子来介绍它,比如下图(图片来自《Ray Tracing The Rest of Your Life》),你想求一个圆的面积(假如你不知道π),那么你可以往这个正方形里面投放均匀随机的点,那么圆的面积和正方形面积的比,就等于在圆内部的点的数量(红色的点)和总数量(红色加橙色)的比。当投放的点越多,结果越接近真实的值:
在图形学中,蒙特卡洛主要是用来估算积分的。我们知道,有些积分公式是可以直接推导出解析解的,比如说积分∫2xdx,一眼就看出它的解析解为x2。但是有许多积分公式是无法直接求出解析解的,比如我瞎写的一个∫((sinx + x3) / tanx2)dx,你能暴力解出来吗?很不幸pbrt的一个主要任务,就是求解光反射的积分公式,回忆公式5.9,
f是BSDF公式,我们拿第八章的Torrance–Sparrow BRDF模型来看看它的样子:
看到这个公式基本已经没什么食欲了,如果再把D和G展开,可以想象有多么复杂。想要求它的解析解几乎是不可能的。但是蒙特卡洛方法可以另辟蹊径,用抽样的方法来得到它的近似值!
前言
跳过...
13.1 Background and Probability review(背景和概率论回顾)
主要是复习概率论中的几个重要概念,这里只简单罗列,不记得的建议看教材...
随机变量(random variable)
通常用X表示。
累计分布函数(cumulative distribution function)
简称CDF,一般用P(X)表示。
概率密度函数(probability density function)
简称PDF,一般用p(x)表示。PDF是CDF的导数:
均匀随机变量(canonical uniform random variable)
数学期望(Expected values)
如果随机变量x在它的定义域中以概率p(x)分布,那么f(x)的平均值可以用期望Ep[f (x)]表示,
方差(variance)
13.2 The Monte Carlo Estimator (蒙特卡洛估算器)
tip:这里最重要....
现在我们定义基本的蒙特卡洛估算器,它可以近似任意一个积分。
假设我们想估算一个1D积分∫abf (x) dx。如果我们有一个均匀分布的随机变量Xi ∊ [a, b],那么蒙特卡洛估算器的定义为:
而估算器的数学期望,E[FN],实际上就等于这个积分∫abf (x) dx。
证明如下,首先,PDF p(x)是均匀分布,也就是它等于1/(b − a),因为p在[a, b]上必须是一个常数且总和为1。剩下的如下推导:
实际上,p(x)不需要限制一定为均匀分布,它其实可以是任意分布!(这也是后面重要性采样的关键)。如果随机变量Xi是从某个任意PDF p(x)分布中抽取的,那么估算器可以写为
p(x)的唯一限制是对于所有的|f(x)|>0的地方,p(x)非零。要证明这个估算器的期望等于积分同样不难:
13.3 Sampling Random Variables(采样随机变量)
回顾上一节的公式13.3中的p(x)分布可以是任意的,后面的重要性采样理论中会得到,p(x)和f(x)的形状越相似,那么用对应的估算器FN的方差收敛的越快。也就是说,如果我们从一个形状类似f(x)的分布p(x)中抽取样本,那么随着样本的增加,FN的值会快速逼近f(x)的积分。
但我们面临的问题一个问题是,怎么才能得到p(x)为任意分布的样本。我们的计算机是很容易产生均匀随机的样本的(比如c语言中的rand函数),但没有一个函数可以产生任意分布的样本,这需要我们自己想办法生成。而下面的Inversion method方法就可以做到。
13.3.1 The Inversion Method
inversion method可以把 均匀随机变量 映射到 我们想要的特定分布的随机变量。为了解释这个过程,我们用一个简单的离散随机变量的例子。
假设一个离散分布有四个随机的输出。每个输出的概率分别是p1,p2,p3和p4,它们的和是1。对应的PDF如图13.1:
为了从这个分布中得到样本,我们首先要找到CDF P(x)。在连续的情况下,P是p的不定积分。在离散的情况下,我们可以直接通过把每个方块从左到右堆起来,得到CDF。如图13.2:
注意最后边的方块必须等于1,因为所有概率的和为1.
为了从这个分布中得到一个样本,我们先产生一个均匀随机变量ξ,如图13.3,在垂直坐标,也就是CDF坐标上,根据随机变量ξ选择一个点,也就是说这个点是均匀且随机的,那么这个点往右延伸(虚线),那么虚线会击中这四个方块中的哪一个,这个事件发生的概率,正好就等于p1,p2,p3和p4。因为ξ是均匀分布的,那么击中方块的概率大小正比于方块的高度(方块长度越长击中的概率就越大),也就是它们的PDF。
具体一点,假如这四个方块对应的随机变量Xi分别是X1=1,X2=2,X3=3,X4=4,概率分别是p(X1)=0.2,p(X2)=0.3,p(X3)=0.4,p(X4)=0.1(它们的和必须为1),如果用上面的方法,先产生一个均匀随机变量的ξ=0.6,那么它正好击中的是第3方块(第3个方块的范围是0.5~0.9),那么最终的输出是X3=3。
对于连续分布的情况和离散类似,只是上面的方块变成了曲线,不再赘述。
这个方法就叫做inversion method(有点CDF的反函数的意思),具体的过程如下:
书中后面还举了几个例子,可以加深理解,在此不记录了。
13.3.2 The Rejection Method
后面好像没看到有应用,先跳过...
13.4 Metropolis Sampling(选读内容,跳过)
13.5 Transforming Between Distributions(分布之间的变换)
在描述inversion method的时候,我们介绍了把均匀随机分布转换为某种特定的分布的技术。在这里,我们将探索更通用的方法,把从任意一个分布中抽取的样本 变换为 另一个分布 的样本。
假设随机变量Xi是从某个PDF px(x)中抽取的。现在,如果我们计算Yi = y(Xi),我们想知道新的随机变量Yi是服从什么分布。这看起来似乎是一个深奥的问题,但这是理解从multidimensional distribution(多维分布)函数中取样的关键。
函数y(x)必须是一对一的;如果多个x映射到相同的y值,那么不可能清楚的描述特定y值的概率密度。一对一的意思是y(x)必须是单调递增或单调递减的(也就是导数要么全部大于0,要么全部小于0),这意味着:
也就是
tip:注意上面这个等式很容易让人误解,Py(y),Py(y(x)),Px(x)这三项的自变量都是x,也就是说,准确的说,Py(y(x))确实等于Px(x),但Py和Px代表的是两个不同的映射,上面的等式会得出Py(y) = Px(x),严格来说也不正确。如下图:
由CDF之间的关系可以直接导出它们PDF的关系。假设y的导数大于0,对两边求导得到:
因此
通常y的导数是严格为正或为负的,因此概率密度的关系为:
我们如何使用这个公式?假设px(x) = 2x,定义域为[0, 1],然后让Y = sin X。那么随机变量Y的PDF是什么?因为我们知道dy/dx = cosx,然后:
通常我们想要某个分布,但是不知道变换(也就是说我们想要特定的Py(y),但是不知道y(x))。例如,我们想从某个分布px(x)中抽取随机变量X,以及从分布py(y)转给你抽取随机变量Y。我们应该使用哪个变换?我们所要做的就是利用Py(y(x)) = Px(x)(注意书中写的是Py(y) = Px(x)),得到:
这其实就是 inversion method 的通用版本,因为如果X是均匀随机分布,那么Px(x) = x,套入上面就会得到之前 inversion method 的结论。
后面13.6节的多维变换,包括半球均匀采样(13.6.1 Uniformly sampling a Hemisphere),采样一个单位碟形(13.6.2 Sampling a Disk),以余弦为权重采样半球(13.6.2 Cosine-weighted Hemisphere Sampling)等,都是很重要的内容,对我们理解如何通过均匀采样分布变换为我们想要的分布非常有用,但因书上讲的时间和篇幅问题,且书中已阐述的很清晰,在此不记录了。
13.7 Russian Roulette and Splitting(俄罗斯轮盘和分裂)
估算器F的效率
估算器F的效率定义为
其中V [F]是它的方差,T [F]是计算它的值所需要的时间。按照这个标准,如果估算器F1和F2产生的方差相同,但F1花更少时间,或者时间相同而F1的方差更小,那么F1就比F2更有效率。后面几个小节讨论一些提高蒙特卡洛效率的方法。
Russian roulette(俄罗斯轮盘)和splitting(分裂)是两种提高蒙特卡洛估算器效率的方法,它们通过提高那么对结果贡献更大的样本的概率,达到提高效率的目的。Russian roulette主要解决某些样本耗时很高但却对结果贡献很小的问题,而splitting则通过在重要的维度上生成更多的样本来提高效率。
俄罗斯轮盘
tip:书中举了一个direct lighting integral(直接光照积分)的例子来解释Russian roulette,因为直接光照是下一章的内容,我在此对直接光照的过程加了些解释,当然这是我个人的理解,不一定对。
例子:direct lighting integral就是只考虑场景中的光源的直接光,而不考虑其他物体反射的间接光(这个下一章才介绍)。如下公式,Lo是Ld(直接光源)的积分。
假设我们在分布p(ω) 上取两个采样点,蒙特卡洛积分器就是
为了更好理解,我描述下自己对直接光照过程的理解,如下图:
过程如下:
1.在某个分布p(ω)上取样,得到两个采样方向,ωi1和ωi2。
2.分别对ωi1和ωi2方向进行可见性检测,也就是判断沿着它们的方向是否会和光源相交(通常是tracing一条shadowing ray实现)。
3.若检测到与光源相交(比如图中的ωi1),那么就计算上面公式的fr(p, ωo, ωi),Ld(p, ωi)等,得到最终的积分结果。
这里有两个点要注意。首先,进行可见性检测是很耗时的(当场景中物体忒多的时候),第二,如果采样的方向接近水平(比如图中的ωi2),fr(p, ωo, ωi)以及|cos θi|很小这两项会很小(也是说即使ωi2没有被物体挡住而与光源相交,它对整个结果的贡献也很小)。我们当然希望舍弃ωi2(这样可以省掉可见性检测的耗时,而不会对结果造成太大的影响)。但是我们不能简单粗暴的把ωi2扔掉(书中的解释是since the estimator would then consistently underestimate the correct result,我还不是特别明白)。而是使用Russian roulette的技术解决这个问题。
Russian roulette的方法是,选择一个termination probability q(终止概率)。这个概率会根据采样方向的积分值(主要是fr和cosθi的大小,也就是对结果的贡献)决定它的大小。当贡献较大时(比如ωi1),对应的q就小;相反(比如ωi2),q就大。然后,对每一个采样方向都进行一次随机选择(通过产生均匀随机变量ξ),当ξ<q时,就不再对这个采样方向进行可见性检测和计算积分了,而是用一个常量c替代(通常c等于0,也就相当于抛弃它了)。而当ξ>q时,就继续对它进行可见性检测和计算积分,只是添加一个权重1/(1 − q)。新的估算器如下:
新的估算器的数学期望和旧的是一样的:
对应上面那个图,ωi2的终止概率就相对比较大,也就是它被抛弃(被常量c替代)的概率很大,但是它仍有很小的概率会被采用,以保证新的估算器的期望是正确的。
书中最后也提出,Russian roulette并不能减少方差,有些情况下甚至会增大方差。它的主要作用是提高效率。
网友评论