




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第14章 蒙特卡罗积分I:基本概念在介绍计算沿光线到达相机的辐射亮度的SurfaceIntergrator类和VolumeIntegrator类之前,我们先做一些关于求解散射积分 方程的基本工作。这些积分方程通常没有解析解,所以我们必须求助于数值方法。虽然诸如梯形积分法和高斯积分法这类标准的数值积分技术在求低维光滑积分时很 有效,但它们对于在渲染过程中所遇到的高维不连续积分而言,其收敛速度还是太慢了。蒙特卡罗积分技术为这个问题提供了一个解决方案。这类方法使用了随机性做积分求值,且收敛速度跟被积函数的维的个数无关。在本章中,我们将回顾一些概率论 中的重要概念,并为使用蒙特卡罗解决渲染过程中的积分
2、问题打下一个基础。下一章将描述提高收敛速度的计算,并描述pbrt所用到的技术。对随机性的明智运用使算法设计领域发生了革命性的变化。随机性算法大致分两大类:拉斯维加斯算法和蒙特卡罗算法。拉斯维加斯算法使用了随机性但最终会产生 相同的结果(如在快速排序算法中随机地选择一个数组项作为主元素)。而蒙特卡罗算法依赖于在算法过程中所使用的不同的随机数列而得到不同的结果,但结果大 致上(在平均意义上)是正确的。所以,对蒙特卡罗算法的多次运行结果做平均,就有可能找到跟正确答案很接近的统计意义上的结果。蒙特卡罗积分是一项用随机采样来估算积分值的技术。蒙特卡罗积分的一个非常有用的特性是:为了估算积分值,我们只需保
3、证能够在定义域中的任意点对被积函数求值。这个特性不仅使得蒙特卡罗技术易于实现,而且可以应用于非常广泛的被积函数类型,包括那些不连续函数。在渲染过程中所遇到的积分是很难或不可能直接求积分的。例如,为了计算表面上某一个点上的反射光的量,我们要用方程(5.6)来对入射辐射亮度和BSDF 的乘积做单位球面上的积分。因为物体的可见性使得在复杂场景中的入射辐射亮度函数会有难以预测的变化,对于这个乘积中的所有项就很难找到封闭形式的表达 式,即使表达式存在,对之进行解析方式的积分也是通常不可能的。因为有了蒙特卡罗积分,计算反射辐射亮度就成为可能,因为我们只需选择球面上的一组方向, 计算相应的入射辐射亮度,分别
4、乘以相应方向上的BSDF值,再用上一个权值项。这样一来就可以处理任意的BSDF、光源和几何体;所要做的只是在任意点上 对这些函数求值。蒙特卡罗积分的主要缺点是,如果用了n个采样点来估算积分,算法收敛到正确解的速度是O(n-1/2)。换句话来说,如果将误差减 半,就要使用4倍的采样点。在渲染过程中,为了计算被积函数的值,每个采样点需要追踪一条或多条光线,当用蒙特卡罗积分做图像合成时,这真是很痛苦的代 价。在图像中,蒙特卡罗采样所产生的人为缺陷会以噪声的形式出现,即像素随机性地出现太黑或太亮的情况。当前许多关于蒙特卡罗积分的研究着重于如何尽可能 地减少误差又要减少采样点的数量。14.4 背景和概率
5、论知识的回顾我们先定义一些基本的术语并回顾一下概率论的基本知识。我们先假定读者已经熟悉了概率论的基本概念;需要对这一领域做近一步的全面了解的读者可以参考相应 的教科书,例如Sheldon Ross的Introduction to Probability Models(2002)。一个随机变量X是在某个随机过程中所选定的一个值。我们通用用大写字母来代表随机变量,特殊情况下我们使用希腊字母代码一些特殊的随机变量。随机变量总是 在某些定义域中抽取出来的,它既可以是离散的(例如一个固定的概率集合),也可以是连续的(如实数集R)。对随机变量X使用函数f就得到另一个新的随机变 量Y = f(X)。例如,随
6、机掷一个骰子的结果就是一个离散的随机变量,它被采样于一个事件集合Xi = 1, 2, 3, 4, 5, 6 。每个事件有一个概率pi = 1/6, 这样概率总和pi一定是1。我们可以取一个连续的均匀分布的随机变量0,1,并将之映射为一个随机变量, 如果下式满足,则取值Xi: j=1,i-1 Pj < j=1,i Pj注意所有的Pi之和为1。一个随机变量的累积分布函数(CDF)P(x)是变量分布中的一个值小于或等于某个值x的概率。 &
7、#160;P(x) = Pr X x以掷骰子为例,P(2) = 1/3, 因为小于或等于2的情况占总数6个中的2个。14.1.1 连续随机变量在渲染过程中,跟离散随机变量相比,会更多地用到连续随机变量,这些变量在一个连续的定义域内取值(如实数域,或单位球上的方向)。其中一个非常重要的随机变量是典型均匀随机变量,记为。该变量之所以重要有两个原因。首先,在软件中生成这个分布的变量很容易,因为大多数运行库中的伪 随机数发生器就可以做到这一点。第二,我们可以先生成典型均匀随机变量再施加上某种变换来得到任意的随机分布。前面所提到的将映射到骰子中6个面就是这 个技术在离散情况中的应用。我们来看另一个定义在
8、0,2上的连续随机变量的例子:它在值x的概率值跟2-x成正比:即在0附近取值的可能性是在1处附近取值时的两倍。概率密度函数(PDF)对此有正规的表述:它描述了随机变量在某个值上取值的相对概率。PDF p(x)是CDF的导数: p(x) = dP(x) / dx均匀随机变量的p(x)是个常数。对于,我们有: p(x) = 1 (当x 0,1) 或 0 (其它情况)PDF必须是非负的,并在其定义域上的积分是1。给定一个定义域中的一
9、个区间a,b,PDF给出了随机变量处于该区间的概率: P (x a,b) = a,b p(x) dx上式可以根据微积分第一基本定理和PDF的定义得出。14.1.2 期望值和方差函数f的期望值Epf(x)被定义成该函数在其定义域的上某种p(x)分布的平均值。在下一节中我们将会看到如何用蒙特卡罗积分计算任意积分的期望值的。在域D中的期望值定义如下: Epf(x) = D f(x)p(x) dx举个例子,考虑一下如何求余弦函数在0,
10、上的期望值,其中p是均匀的。因为PDF p(x)在定义域上的积分必须为1,所以 p (x) = 1 / 。故有: Ecosx = 0, p(x) dx = (-sin + sin 0) / = 0这正是所期望得到的值,考虑一下cosx在0,的曲线就明白了。一个函数的方差是函数值跟其期望值的误差函数。方差是用来量化蒙特卡罗算法估算值的误差的基本概念。它提供了误差量化的精确方法,并可以测量蒙特卡罗算法 为减少误差所做的改进程度。第15章的大部分内容将用来介绍减少方差从而改进pbrt的计算结果的技术。一
11、个函数f的方差定义为: Vf(x) = E (f(x) - E f(x)2 从期望值和方差定义中,我们马上可以看到它们有三个重要的性质。 E a f(x) = a E f(x) E i f(Xi) = i E f(Xi) V a f(x) = a2 V f(x)利用这些性质做些简
12、单的代数推导,可以得到方差的一个更简单的表达式: Vf(x) = E (f(x) 2 - E f(x) 2这样,方差只是函数平方的期望值减去期望值的平方。如果随机变量是相互独立的,那么方差还有这样的性质,即方差的和等于和的方差: i Vf(Xi) = V i f(Xi)14.2 Monte Carlo估计量现在我们可以定义基本的Monte Carlo估计量了,它可以近似地估算任意积分的值。这是第16,17
13、章中光传输算法的基础。假定我们想要对一个一维积分a, b f(x) dx求值。对于一个均匀分布的随机变量Xia,b,Monte Carlo估计量用下式给出期望值: FN = (b - a) / N 1,n f(Xi)E(FN)就是这个积分值。这可以用几步推导来得出。注意随机变量Xi所对应的PDF p(x)必须等于1/(b-a),因为p必须是常量,并且在a,b上的积分为1。推导如下:我们做一些一般化推广,就可以去掉随机变量必须是均匀的限制。这是极其重要的一步,因为对生成采样的PDF的选取是减少蒙特卡罗
14、方差(第15.4节)的重要技术。如果随机变量是某个任意PDF p(x)来抽取的,那么下面的估计量可用来估算积分: FN = 1/ N 1,Nf(Xi) / p(Xi)p(x)的唯一的限制是它必须在所有 满足F(x) > 0的x为非零。类似地,我们可以看出这个估计量的期望值计算所要求的积分:我们可以直接将这个估计量推广到高维或复杂的积分域中。从多维PDF生成的N个采样也可以照样使用这个估计量。例如,考虑一个三维积分: xo,x1 yo,y1
15、160; yo,y1 f(x,y,z) dxdydz如果采样Xi = (xi, yi, zi)从三维盒(x0,y0,z0)-(x1,y1,z1)中均匀地取出,则PDF p(X)就是常量: 1/(x1-x0)(y1-y0)(z1-z0)估计量为: (x1-x0)(y1-y0)(z1-z0) / N f(Xi)注意采样个数N是任意选取的,跟被积函数的维数无关。这是另一个Monte Carlo对传统积分的优势。蒙特卡罗所使
16、用的采样个数完全独立于积分维数,而标准的数值积分计算所需要的采样个数跟维数呈指数级增长。只指出蒙特卡罗估计量可以收敛于正确结果还不够,因为良好的收敛速度也是很重要的。我们这里不做推导,只指出其误差按照O(N1/2) 的速度收敛(N为采样个数)。虽然标准积分技术在一维的情况下的收敛速度要高于这个速度,但随着被积函数的维数增加,其性能会有指数级的下降,而蒙特卡罗 的收敛速度跟维数无关,这样蒙特卡罗就成为唯一可行的高维积分的数值积分技术。我们已经遇到一些高维积分的例子,在第16章的路径跟踪公式实际上是个无限 维的积分!14.3 随机变量的采样为了对蒙特卡罗估计量求值,必须能够从所选定的概率分布中抽取
17、随机采样。本节介绍这个过程的基本知识,并举一些简单的例子。下一节将介绍一般性的多维情况,下一章的第15.5节和15.6节将利用这些技术在BSDF和光源的分布中生成采样。14.3.1 逆转法逆转法使用一个或多个均匀随机变量,并将之映射到所需分布的随机变量中。为了解释这个过程,我们先看一个简单的离散的例子我们有一个4种结果的过程,每个结果的概率分别为p1,p2,p3,p4,并且p1+p2+p3+p4=1。相应的PDF如下: 为了在这个分布中取样,我们先求CDF P(x)。在连续的情况下,P是p的不定积分。在离散的情况下,我们可以直接从左边开始,将相应的直方条叠在一起,如图
18、:(注意最右的一叠的高度为1,因为所有的概率之和为1)。为了在分布中抽样,我们使用一个均匀随机数,用它通过CDF来选择其中一个可能的结果,并且要求该结果的概率等于它自己的概率。如图,事件的概率被投影 到垂直轴上,随机变量从中选取概率值。应该清楚这个抽样的分布是正确的,即均匀采样的概率恰好等于它所碰到的特定直方条的高度。为了将这个技术推广到一 般的连续分布上,我们可以考虑当离散的概率个数趋于无穷大的情况。则上面的PDF变成一个光滑的曲线,而CDF就是它的积分。上面所表示的投影过程仍然一 样,这个投影有一个很方便的数学解释,即它表示求CDF的反函数,并在处求反函数的值。这个技术被称为逆转法。更精确
19、地讲,我们可以从一个任意的PDF p(x)中按照下列步骤抽取采样Xi:1. 计算CDF P(x) = 0, x f(x') dx'。2. 求反函数P-1(x)。3. 取一个均匀分布的随机数。4. 计算Xi = P-1()。14.3.2举例:幂分布作为一个该过程的一个例子,我们考虑从一个幂分布抽样的过程。我们在对Blinn微平面模型采样时就是这种情况。幂分布的PDF为: p(x) = c x n第一个任务是求PDF。在大多数情况下,这值涉及到求比例常数c。我们可以利用p(x)dx = 1就可以得到:所以,p
20、(x) = (n+1)xn。我们对之积分,就可以得到CDF: P(x) = 0, x f(x') dx' = x n+1求反函数很简单: P-1(x) = x (1/n+1)。这样,给定一个均匀随机变量,从幂分布抽样所得到的结果是: X = (1/n+1)14.3.3 举例:指数分布当我们渲染有参与介质的图像时,经常要从一个指数分布中抽样。第一步是对该分布进行归一化,使其积分值为1。在这种情况下,我们希望所生成的采样能够覆盖0, infnite),而不是0,
21、1,故有:所以c = a,而PDF为p(x) = ae-ax。对之积分得到P(x): 该函数的反函数为: P-1(x) = - ln(1-x) / a故我们可以得到下列的抽样: X = - ln(1- ) / a我们可以对该式做近一步地简化,因为是均匀分布的随机数,故1- 也是均匀分布的,故而我们可以将1- 替换成而不影响分布,故有:
22、 X = - ln() / a14.3.4 举例:一维分段函数另一个很有趣味的练习是在一个一维分段函数上取样。不失一般性,我们只考虑定义在0,1上的分段函数假定该函数的定义域被分为N等分,每等分为=1/N。这些区间的端点为xi = i ,其中i的范围是0到N。在每个区间中,f(x)为一个常量。如图: f(x) = vi , 其中 xi <=x < xi+1 (i = 0, N - 1)积分f(x)dx
23、为: c = 0,1f(x)dx = i=1,N-1 vi / N 我们很容易构造出f(x)的PDF p(x), 即f(x)/c。CDF P(x)是分段的线性函数(上面图b)。 在点xi和xi+1之间,CDF按照斜率vi/c线性增加回忆一下为了对f(x)采样,我们需要求CDF的翻函数,并找到值x,使得: = 0,xf(x')dx' = P(x)由于CDF是单调递增的,故x必在xi
24、到xi+1之间,并满足P(xi) <= <= P(xi+1)为了有效地进行采样,我们提供一个函数,它从f(x)的vi中取值,计算在xi的CDF值,并返回f(x)的积分值。<MC Function Definitions> = void ComputeStep1dCDF(float *f, int nSteps, float *c, float *cdf) <Compute integral of step function at xi>
25、0; <Transform step function integral into cdf> 该函数先计算f(x)的积分。它将结果存放到cdf数组,故无需再申请额外的内存。调用者必须为cdf数组申请nStep+1个浮点数的内存空间,因为如 果f(x)有N个阶梯值,则需要存放CDF在每个N+1个xi处的CDF值。在数组后面存放CDF值1是冗余的,但有利于简化代码。<Compute integral of step function at Xi> int i; &
26、#160; cdf0 = 0.; for (i = 1; i < nSteps+1; +i) cdf i = cdf i - 1 + f i - 1 / nSteps;由于在0,1上的积分值存放到在cdfnSteps中,CDF可以用这个值进行归一化:<Transform step function integral into cdf> = *c = cdfnSteps; for
27、(i = 1; i < nSteps+1; +i) cdf i /= *c;下列函数用来对函数采样: <MC Function Definitions> += float SampleStepld(float *f, float *cdf, float c, int nSteps, float u, float *pdf)
28、 <Find surrounding cdf segments> <Return offset along current cdf segment> 首先我们需要找到覆盖的一对CDF值。因为cdf数组是单调递增的,我们可以用二分查找来得到它。其中用到c+标准函数lower_bound()。<Find surrounding cdf segments> = flo
29、at *ptr = std:lower_bound(cdf, cdf+nSteps+1, u); int offset = (int) (ptr-cdf-1);有了这一对CDF值,我们就可以计算x值了。我们确定在cdfoffset和cdfoffset+1中的位置。因为CDF是线性的,x位于xi 和xi+1之间。这个采样的PDF p(x)很容易计算,因为我们有归一化值c,它满足p(x) = f(x) / c。<Return offset along current cdf segment> = u = (u - cdfoffset)
30、 / (cdfoffset+1 - cdfoffset); *pdf = foffset / c; return (offset + u) / nSteps;14.3.5 拒绝法对于某些函数,我们无法使用积分的方法求它们的PDF,或者无法解析地得到CDF的反函数。拒绝法(rejection method)可以不做这两步也可以按照函数的分布来生成采样,这实际上是掷飞镖方法。假定我们要在函数f(x)上采样,但我们有一个PDF p(x)满足f(x) < cp(x),c为某个常数,并且假定我们知道如何从p上采样。这时拒绝法就很简单:
31、 loop forever: sample X from p's direction if < f(X) / (cp(X) then return X这个例程重复不断地选择一对随机变量(X, )。如果点(X, cp(X)位于f(X)之下,则接受采样X,否则就拒绝它,并选择下一对采样。无需深入讨论,我们就可以明白该方法的效
32、率依赖于cp(x)界定f(x)的紧密程度。该技术适用于任何维数。在实际应用中, pbrt中的任何蒙特卡罗算法都没有使用拒绝法。我们通常需要找跟f(x)类似的可以直接进行采样的分布,下一章我们再介绍其中的原因。然而,拒绝法是一 项值得关注的重要技术,特别是在调试蒙特卡罗的程序时。例如,如果我们怀疑使用逆转法抽样程序有错误,我们可以用更直接的基于拒绝法的实现代替之,再看蒙 特卡罗估计量是否计算出相同的结果。当然,这要进行大量的采样。14.3.6 举例:用拒绝法采样单位圆假定我们想要在一个单位圆内选一个均匀分布的点。如果使用拒绝法,只需随机地在外切正方形内选择一个随机位置(x,y),再看它是否落在圆
33、内。如图: 下面的RejectionSampleDisk()函数实现了这个算法。我们可以用类似的方法来生成任意复杂形状之内的均匀分布采样,只要该形状有一个测试点在形状之内或之外的方法。<Monte Carlo Function Definitions> += void RejectionSampleDisk(float *x, float *y) float sx, sy;
34、160; do sx = 1.f - 2.f * RandomFloat(); sy = 1.f - 2.f * RandomFloat(); while (sx*sx + sy*sy > 1.f); *x = sx;
35、; *y = sy; 一般地说,拒绝法的效率依赖于被拒绝的采样所占的比例。对于2D的均匀采样的情况,还是很容易计算的,即是圆面积除以外切正方形面积:/4,约等于78.5%。对于一般的n维情况,在超球内采样的效率会随着n值的增大而降低(因为n维的超球体积趋于0)。14.4 分布之间的变换为了描述逆转法,我们介绍了一种按某种分布生成采样的技术,它将典型均匀分布的随机变量以特定的方式进行变换。这里我们将研究将采样从任意一种分布变换到另一种分布的更一般化的问题。假定我们有一个从某个PDF Px(x)抽样的随机变量X
36、i。现在,如果我们要计算Yi = y(Xi),我们想要找到新随机变量Yi的分布。这看上去是个很奇怪的问题,但我们将体会到理解这种变换对从多维分布函数中抽样至关重要。函数y(x)必须是一一映射。如果多个x值被映射到同一个y值,那么就无法清楚地描述一个y值的概率密度。由于y必须是一一映射,那么它的导数必须严格大于0或严格小于0,这就意味着下式成立: Pr y <= y(x) = Pr X <= x所以: Py(y) = Py(y(x) =
37、Px(x)利用这个CDF之间的关系可以直接导出它们PDF之间的关系。如果我们假定y的导数大于0,通过求微分,可知: py(y) dy/dx = px(x)故有: py(y) = (dy/dx) -1 px(x)一般而言,y的导数要么严格为正,要么严格为负,它们的密度关系式如下: py(y) = |dy/dx| -1 px(x)怎么用这个公式呢?假定px(x) = 2x,定义域
38、为0,1,令Y = sinX。随机变量Y的PDF是什么呢?因为我们知道dy/dx = cosx, py(x) = px(x) / |cosx| = 2x / cosx = 2sin-1y/(1-y2)1/2)这个例程似乎有些倒退-通常我们已知某个采样的PDF,而不是某个变换。例如,我们想从某个px(x)抽样的X,想要从某个分布py(y)计算出Y。那么我们用什么变换呢?我们只需要求它们的CDF相等,即Py(y) = Px(x), 那么就可以得到变换:
39、;y(x) = Py-1(Px(x)这是逆转法的一般化情况,因为如果X是在0,1均匀分布的,就有Px(x)=x,就会得到上一节的相同的例程。14.4.1 多维情况下的变换对于一般的n维情况,我们可以有类似的推导来得到不同密度之间的类似关系。这里不再列出推导过程了,因为它跟一维情况有相同的形式。假定我们有一个n维随机变量X,其密度函数为px(x)。另Y = T(X), 其中T为一个双射函数。这时,密度关系式为: py(y) = py(T(x) = px(x) / |JT(x)|其中|JT|是T的雅克比矩阵的行列式值的绝对值
40、。14.4.2 举例: 极坐标极坐标变换公式为: x = r cos y = r sin假定我们要从每个密度函数p(r, )抽样,相应的密度函数p(x,y)应该是怎样的?这个变换的雅克比矩阵为: 它的行列式值为r(cos2 + sin2) = r。所以p(x,y) = p(r, ) / r。当然并非我们想要得到的结果-因为我们先从笛卡尔坐标系开始采样再将之变换到极坐标,这时我们有p(r, ) =
41、 r p(x,y)。14.4.3 举例:球面坐标球面坐标变换公式为: x = r cos cos y = r sinsin z = r cos这个变换的雅克比行列式值为| JT| = r2sin,所以相应的密度函数为: p(r, , ) = r2sin p(x,y,z)这个变换很重要,因为它可以将方向用
42、单位球上的点(x,y,z)来表示。我们记得立体角是用单位球面上的点集面积来定义的。在球面坐标系中,我们在前面推导过: d = sin d d所以,如果我们有一个在立体角上的密度函数,这意味着下式成立: Pr = p()dw我们就可以推导出关于 和的密度函数: p(, ) d d = p() d
43、160; p(, ) = sin p()14.5 使用多维变换的2D采样假定我们有一个2D联合密度函数p(x,y)做(X,Y)的采样。有时多维函数是可分离的,可以被表示为多个一维密度函数的乘积,例如: p(x,y) = px(x) . py(y)在这种情况下,我们可以独立地从px采样X,从py中采样Y来得到(X,Y)。但是,许多有用的密度函数并不是可分离的,所以我们要介绍如何在一般情况下进行多维分布的采样理论。给定一个2D密度函数,我们可以“积分掉”两维中的一个而得到边缘密度函数:
44、160; p(x) = p(x,y)dy这个函数可以视为X单独的密度函数。更精确的说法是,它是特定的x对所有可能的y值的平均密度。条件密度函数p(y|x)是选定某个x的关于y的密度函数: p(y|x) = p(x,y) / p(x)从联合分布中进行2D采样的基本思想是,先计算出边缘密度函数,将一个变量分离出来,再用标准的一维技术利用该密度函数采样。一旦得到这个采样,再计算这个采样值所对应的条件密度函数,然后再利用标准的一维技术继续采样。14.5.1 举例:在半球上的均匀采样做为一个例子
45、,我们在半球上根据立体角均匀地对方向采样。我们还记得均匀分布的意义是密度函数是一个常量,所以我们有p() = c。由于密度函数在其定义域上积分必须为1,我们就得到: 故而p() = 1/(2),或者p(,) = sin/(2)。注意这个密度函数是可分离的。然而,我们仍使用边缘密度和条件密度来演示多维采样技术。我们先来采样。为此,我们需要知道的密度函数p(): p() = 0,2 p(,)d = 0,2sin d = sin现在我们计算的条件密度: p(|) = p(,)
46、/p() = 1/(2)注意到的密度函数本身是均匀的,这可以从半球的对称性上直观地看出来。现在我们用一维逆转技术分别对这些PDF进行采样: P() = 0, p(')d' = 1 - cos P(|) =0, 1/2 d ' = /2 我们可以很方便地得到它们的反函数,注意到和1-在0,1都是均匀分布的随机变量,我们可以用代替1-,就得到: = cos -1 1 = 2
47、 2将这些值变换会笛卡尔坐标系中,就得到最后的采样公式: 我们用下面的代码来实现这个采样策略。我们传入两个均匀分布的随机数u1,u2,得到一个半球上的向量:<MC Function Definitions> COREDLL Vector UniformSampleHemisphere(float u, float u2) float z = u;
48、; float r = sqrtf(max(0.f, .f - z*z); float phi = 2 * M_PI * u2; float x = r * cosf(phi); float y = r * sinf(phi); return Vector(x, y, z);
49、160; 在pbrt中,对于每个类似这样的采样例程,都有一个对应的返回特定采样的PDF值的函数。对于这样的函数,我们需要搞清楚到底是用哪一个PDF求值 -例如,在对半球上方向上采样时,我们已经看到这些密度函数即可以用立体角表示,也可以用(,)表示。对半球(包括所有其它关于方向的采样)而 言,这些函数返回关于立体角的值,立体角的PDF是一个常数 p() = 1/(2)。<MC Function Definitions> += COREDLL float UniformHemispherePdf(float theta, float phi) &
50、#160; return INV TWOPI; 在整个球面上的均匀采样公式可以用相同的方式推导出来,这里略去了。公式如下:<MC Function Definitions> += COREDLL Vector UniformSampleSphere(float u1 , float u2) float z = 1.f - 2.f * u1;
51、0;float r = sqrtf(max(0.f, 1.f - z*z); float phi = 2.f * M_PI * u2; float x = r * cosf(phi); float y = r * sinf(phi); return Vector(x, y, z);
52、0; <MC Function Definitions>+= COREDLL float UniformSpherePdf() return 1.f / (4.f * M_PI); 14.5.2 举例:在单位圆盘上的采样虽然圆盘看上去比半球更简单,但要进行均匀采样却更麻烦一些。一个直观但不正确的解决方案是: r = 1, = 2 2。虽然所得到的结果是随机的且落在圆盘之内,但它并不是均匀分布的,而是采样点挤在靠近圆心的位置。因为我们
53、是根据面积来进行均匀采样,PDF p(x,y)必须是个常数。通过归一化约束我们得到 p(x,y) = 1 / 。如果我们变换到极坐标系中,则有p(r, ) = r / 。现在我们使用前面介绍的方法计算边缘密度和条件密度: 跟半球上采样一样,由于圆的对称性,我们知道p( | r)是一个常数。通过积分和求反函数,就得到了P(r), P-1(r), P() 和p-1()。我们可以求得在圆盘上均匀采样的正确解: r = 11/2
54、 = 2 2<Monte Carlo Function Definitions> += void UniformSampleDisk(float u1, float u2, float *x, float *y) float r = sqrtf(u1); float theta = 2.0f * M_PI * u2; *x = r *
55、cosf(theta); *y = r * sinf(theta); 虽然解决了目前的问题,但圆盘上的面积却产生了变形(如图),第15.2.3节再介绍这种变形所带来的坏处。Peter Shirley(1997)开发出一种从单位正方形到单位圆的“同心”映射来避免这个问题(如图)。 同心映射将正方形-1,1x-1,1上的点均匀地按照“同心正方形-同心圆”的方式进行映射,如图:正方形上的三角楔形被映射为饼条形状,映射公式为:
56、 r = x = y / x<Monte Carlo Function Definitions> += void ConcentricSampleDisk(float u1, float u2, float *dx, float *dy) float r, theta; <Map uniform rando
57、m numbers to 1, 1x-1,1> <Map square to (r , )> *dx = r * cosf(theta); *dy = r * sinf(theta); <Map uniform random numbers to 1, 1x-1,1> float sx = 2
58、* u1 - 1; float sy = 2 * u2 - 1;<Map square to (r , )> = <Handle degeneracy at the origin> if (sx >= -sy) if (sx > sy) <Handle first region of disk>
59、; else <Handle second region of disk> else if (sx <= sy)
60、0; <Handle third region of disk> else <Handle fourth region of disk> theta *= M_PI / 4.f;<Handl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- ESG体系下的AI研究:多维投资增效防范伦理风险
- 冷链物流温控技术在冷链食品冷链配送中的质量保障体系优化与提升报告
- 2025年医药行业CRO模式下的供应链管理与物流优化报告
- 短视频平台内容版权纠纷处理与行业规范报告
- 绿色金融产品创新与绿色金融市场创新产品创新政策效应分析报告
- 民办教育机构2025年合规运营与品牌形象升级研究报告
- 文明校园广播稿(范本14篇)
- 快递行业Presentation:需求韧性持续、价格波动加剧
- 县级网格化监督管理制度
- 景区巡查安全管理制度
- 广东省广州市增城区2023-2024学年八年级下学期期末数学试题(含答案)
- 广东省广州市番禺区2022-2023学年三年级下学期数学期末试卷(含答案)
- 分包安全生产管理制度
- 南充中考理综试题及答案
- 厂区卫生清洁管理制度
- 养老项目商业计划书
- 2025年新高考1卷(新课标Ⅰ)数学试卷
- 2025北京初三一模英语汇编:材料作文
- 2024-2025 学年八年级英语下学期期末模拟卷 (南通专用)原卷
- 日本动画产业发展特征与趋势分析
- 2025河南中考:历史必背知识点
评论
0/150
提交评论