引言
在渲染中,经常使用多维定积分的计算:例如,确定空间光源(区域光)的可见性,到达像素区域的光度,在一段时间内到达的光度以及通过表面点半球进入的辐射。 这些积分的计算通常使用蒙特卡洛积分进行,其中将积分替换为随机实验的期望值。
在本文中,我将详细介绍基本的蒙特卡洛积分过程,以及减少这种技术差异的几种技术。 这将从实用的角度进行-假设读者对概率理论不是很熟悉,但仍想开发有效且正确的渲染算法。
定义积分
定积分是形式的积分
intbaf(x)dx 在哪里
[a,b] 是一个细分(或区域),
x -标量,以及
f(x) -可以为段中的任何点计算的函数。 如
Wikipedia所写,某个整数是一个平面上带有符号的区域
x 受时间表限制
f 轴心
x 和垂直线
x= 和
x=b (
图1a )。
这个概念在逻辑上扩展到了更大的维度:对于某些双积分,
带有符号的
区域变为
带有符号的
体积 (
图1b ),并且通常对于某些多重积分,它变为
带有符号的
多维体积 。
图1:某些积分的例子。在某些情况下,可以通过
分析确定面积,例如
f(x)=2 :在细分市场上
[a,b] 面积相等
2(b−a) 。 在其他情况下,例如当我们需要找出水面上冰山部分的体积时(
图1c ),就不可能采用解析解决方案。 在这种情况下
f(x) 通常可以通过
抽样确定。
数值积分
我们可以使用
数值积分来近似计算复杂积分的面积。 一个例子是
黎曼和 。 通过将区域划分为规则形状(例如矩形)来计算此数量,规则形状一起形成类似于真实区域的区域。 黎曼和定义如下:
tag1S= sumni=1f(xi) Deltaxi
n 是子间隔的数量,并且
Deltaxi= fracb−an -一个子间隔的宽度。 对于每个间隔
我 我们取样
f 在某一点上
xi 在子间隔内(在
图2中,此点位于子间隔的开始)。
图2:黎曼和。值得注意的是,随着
n 黎曼和收敛到积分的实值:
\标记2 intbaf(x)dx= lim|| Deltax||\到0 sumni=1f(xi) Deltaxi
黎曼和也可以用于大尺寸(
图3 )。 但是,这里我们面临一个问题:对于具有两个参数的函数,如果要获得与二维情况下可使用的分辨率相当的分辨率,则子间隔的数量应大得多。 这种现象称为
尺寸的
诅咒 ,而在更高
的尺寸中 ,这种现象会加剧。
图3:双积分的黎曼和。现在,我们将评估以下函数的黎曼和的准确性(我们有意选择了一个复杂函数):
tag3f(x)=\左| sin\左( frac12x+ frac pi2 right) tan fracx27+ sin\左( frac35x2 right)+ frac4x+ pi+1−1\右|
段上的功能图
[−2.5,2.5] 如下所示。 作为参考,我们在
Wolfram Alpha中计算了某个积分
int2.5−2.5f(x) 到达区域
3.12970 。 右图显示了使用黎曼和求和的数值积分精度
n 。
图4:函数图和黎曼和精度。 即使小 n 我们得到一个相当准确的结果。为了获得准确性的概念,我们给出数字:
n=50 错误是
〜2 times10−3 。 在
n=100 错误是
〜3 times10−4 。 可以得到以下数量级
n=200 。
有关黎曼金额的更多信息,请参见以下资源:
蒙特卡洛(1)
渲染时,几乎没有(也许根本没有?)积分是
单个的 。 这意味着我们将很快遇到维度的诅咒。 此外,以相等的间隔对一个函数进行
采样会 导致 采样和
失真 不足 :我们可以跳过该函数的重要值,或者在采样的函数和采样模式之间获得意外的相互干扰(
图5 )。
图5:失真会导致部分采样函数丢失(红色),在这种情况下,会导致对函数的完全错误解释。使用称为
Monte Carlo积分的技术可以解决这些问题。 类似于黎曼和,它在一组点上也使用函数采样,但是与
确定性黎曼和模式不同,我们使用根本上
不确定的成分:随机数。
蒙特卡洛积分基于以下观察结果:可以用随机实验的
期望值代替积分:
\标签4 intbaf(x)dx=(ba)E\左[f(X)\右]\大约 fracban sumni=1f(X)
换句话说,我们对函数进行采样
n 段中任意点的时间(用大写字母表示)
X ),对样本求平均值,然后乘以线段的宽度(对于一维函数)。 就像黎曼和一样,
n 到无穷大,样本的平均值收敛到期望值,即积分的真实值。
一点概率论
了解此处使用的每个概念很重要。 让我们从
等待开始:这是单个样本的期望值。 请注意,这不一定是
可能的值,这似乎违反直觉。 例如,当我们掷骰子时,期望等于
3.5 -所有可能结果的平均值:
(1+2+3+4+5+6)/6=21/6=3.5 。
第二个概念是
随机数 。 这看起来似乎很明显,但是对于蒙特卡洛积分,我们需要均匀分布的随机数,即 每个值都应具有相等的生成概率。 稍后我们将详细讨论。
第三个概念是
偏差及其相关的
方差 。 即使我们采用少量数字,预期平均值以及每个样本的预期值也应相同。 但是,在计算
方程式4时,我们很少得到这样的值。 偏差是期望与实验结果之间的差异:
X−E(X) 。
实际上,这种偏差具有有趣的分布:
这是
正态分布或
高斯分布的图形:它表明并非所有偏差均可能。 实际上,大约有68.2%的样品在此范围内
−1 sigma..1 sigma 在哪里
sigma (sigma)是
标准偏差 。 标准偏差可以用两种方式描述:
- 标准偏差是数据变异性的量度 。
- 95%的数据点在 2\西格玛 从平均水平。
有两种确定标准偏差的方法:
- 标准偏差 sigma= sqrt frac1n sumni=1\左(Xi−E\左[X\右]\右)2 :可以计算是否存在离散的概率分布并且期望值是已知的 E[X] 。 这对于其中的多维数据集是正确的 X=1,2,3,4,5,6 和 E[X]=3.5 。 代入数字,我们得到 sigma=1.71 。
- 同样,样品的标准偏差可以计算为 sigma= sqrt frac1n−1 sumni=1\左(Xi−X\右)2 。 在Wikipedia上阅读有关此内容的更多信息。
检查:这是正确的吗? 如果 sigma=1.71 ,我们声明68.2%的样本在3.5的1.71之内。 我们知道 2,3,4,5 满足此条件,并且 1 和 6 -不 六分之四为66.7%。 如果我们的多维数据集可以在区间中产生任何值 [1..6] ,那么我们将获得准确的68.2%。
代替标准偏差,相关的
方差概念被定义为
Var\左[X\右]= sigma2 。 由于使用了平方,因此方差始终为正,这有助于计算。
蒙特卡洛(2)
上面,我们使用黎曼和求和近似计算了
方程3 。 现在,我们使用蒙特卡洛积分重复该实验。 回想一下蒙特卡洛积分的定义如下:
\标签5 intbaf(x)dx=(ba)E\左[f(X)\右]\大约 fracban sumni=1f(X)
让我们将其转换为C代码:
double sum = 0; for( int i = 0; i < n; i++ ) sum += f( Rand( 5 ) - 2.5 ); sum = (sum * 5.0) / (double)n;
来自的值的结果
n=2 之前
n=200 如下表所示。 从中可以假设,蒙特卡洛积分的表现远比黎曼和差。 仔细检查错误后发现
n=200 黎曼和的平均误差为
0.0002 和蒙特卡洛
0.13 。
图6:2..200样本处的蒙特卡洛误差在较大的尺寸中,这种差异会减小,但不会完全消除。 下面显示的等式是上面使用的等式的扩展版本,具有两个参数:
f(x,y)=\左| sin\左( frac12x+ frac pi2 right) tan fracx27+ sin\左( frac16x2\右)+ frac4x+ pi+1−1\右|\左| sin\左(1.1y\右) cos\左(2.3x\右)\右|(6)美
图7:以上公式的图形。在定义领域
x∈[−2.5,2.5],y∈[−2.5,2.5] 受此功能和平面限制的音量
xy 等于
6.8685 。 在
n=400 (20×20个样本)黎曼和的误差为
0.043 。 对于相同数量的样本,平均蒙特卡洛积分误差为
0.33 。 这比以前的结果要好,但是区别仍然很大。 为了理解这个问题,我们将研究著名的蒙特卡洛积分色散降低技术,即“分层”。
图8:分层的影响; a)分布不良的样品; b)样品分布均匀。分层提高了随机数的
一致性 。 在
图8a中 ,使用八个随机数对函数进行采样。 由于每个数字都是随机选择的,因此它们通常在定义范围内分布不均。
图8b显示了分层的效果:将定义区域分为八个层,并在每个层中选择一个随机位置,这提高了均匀性。
对方差的影响是相当明显的。
图9a显示了分层和不分层的结果图。
图9b显示了近似值误差。 在
n=10 8个层的平均误差为
0.05 ; 20层-
0.07 ,对于200层,它减少到
0.002 。 基于这些结果,似乎值得使用大量地层。 但是,分层的缺点是随着层数的增加而增加。 首先,样本数应始终为层数的倍数; 其次,就像在黎曼和中一样,分层受到维度诅咒的困扰。
图9:分层和方差:a)从n = 2到n = 200的样本数量的近似值; b)偏差。重要性样本
在前面的部分中,我们平均采样了方程式。 蒙特卡洛
积分功能的扩展使我们可以改变情况:
\标签7 intbaf(x)dx=(ba)E\左[f(X)\右]\大约 fracban sumni=1 fracf(X)p(X)
在这里
p(X) 是
概率密度函数(pdf) :它确定随机变量取某个值的相对概率。
对于区间中的均匀随机变量
0..1 ,pdf为1(
图10a ),这意味着每个值都有相同的选择概率。 如果我们将此功能集成到
[0,0.5] 然后我们得到概率
0.5 什么
X< frac12 。 对于
X> frac12 我们显然得到了相同的概率。
图10:概率分布。 a)恒定的pdf,每个样本具有相同的选择概率; b)pdf,低于0.5的样本具有较高的选择概率。图10b显示了另一个pdf。 在这种情况下,生成数字的可能性较小
frac12 等于70% 可以使用以下代码段来实现:
float SamplePdf() { if (Rand() < 0.7f) return Rand( 0.5f ); else return Rand( 0.5f ) + 0.5f; }
该pdf定义如下:
\ tag {8} p(x)= \左\ {\开始{矩阵} 1.4,如果x <\ frac {1} {2} \\ 0.6,否则\结束{matrix} \ right
数字
1.4 和
0.6 反映需求的可能性
x< frac12 等于70% 整合pdf时
[0.. frac12] 给
1.4\次 frac12 和
0.6 times frac12 等于
0.3 。 这说明了所有pdf的一个重要要求:集成pdf的结果
应为1。另一个要求是
p(x) 如果不能为零
f(x) 非零:这意味着零件
f 采样概率为零,这显然会影响该值。
了解pdf概念的一些技巧:
- 一个pdf值不能描述概率:因此,本地pdf可以大于1(例如,就像刚刚检查的pdf)。
- 但是,pdf定义范围内的积分是一个概率,这意味着pdf的积分为1。
一个值可以解释为特定值出现的
相对可能性 。
值得考虑的是, 正态分布是一个概率分布函数:它为我们提供了某个随机变量处于一定间隔内的概率。 在正态分布的情况下,此随机变量是与平均值的偏差。 像任何体面的pdf一样,对正态分布求积分的结果是1。
因此,
公式7允许我们执行非均匀采样。 它通过将每个样本除以其选择的相对概率来进行补偿。 其重要性
如图11a所示。 功能图显示了一个重要的时间间隔,其值是
0 。 在该区域进行采样是没有意义的:总和中不添加任何内容,我们只需将其除以更大的数字即可。 记住
图1c中的冰山:在冰山周围的大面积上采样高度是没有意义的。
图11:具有零值的函数的pdf。使用此功能知识的pdf显示在
图11b中 。 请注意,对于值范围,此pdf实际上为零。 这不会将其转换为错误的pdf:在某些地方,该功能为零。 我们可以将这个想法扩展到零以上。 样本最好花在函数具有重要价值的那些地方。 实际上,
理想pdf 与采样函数成正比 。 关于我们的功能的一个非常好的pdf显示在
图12a中 。 更好的pdf显示在
图12b中 。 在这两种情况下,我们都不要忘记对其进行
归一化 ,以使积分等于1。
图12:图11中功能的增强pdf图12中的pdf为我们提出了两项任务:
- 如何创建这样的pdf文件;
- 如何采样这样的pdf?
这两个问题的答案是相同的:
我们不需要这样做。 在许多情况下,我们要集成的功能是未知的,而确定重要位置的唯一方法是对其进行采样,为此,我们需要pdf。 “鸡肉和鸡蛋”的经典情况。
但是,在其他情况下,我们对函数可以给出较高值或零值的位置有一个大概的了解。 在这种情况下,非常粗糙的pdf通常比没有pdf更好。
另外,我们可能有机会即时创建pdf。 几个样本给出了函数形式的概念,在此基础上,我们将后续样本定位到我们希望获得较高值的地方,这些地方将用于改善pdf等。
在下一篇文章中,我们将把这些概念应用于渲染实现。 一个严重的挑战是建立pdf。 我们研究了pdf有助于抽样的几种情况。