物理精确渲染的概率论

图片

引言


在渲染中,经常使用多维定积分的计算:例如,确定空间光源(区域光)的可见性,到达像素区域的光度,在一段时间内到达的光度以及通过表面点半球进入的辐射。 这些积分的计算通常使用蒙特卡洛积分进行,其中将积分替换为随机实验的期望值。

在本文中,我将详细介绍基本的蒙特卡洛积分过程,以及减少这种技术差异的几种技术。 这将从实用的角度进行-假设读者对概率理论不是很熟悉,但仍想开发有效且正确的渲染算法。

定义积分


定积分是形式的积分  intbafxdx 在哪里 [ab] 是一个细分(或区域), x -标量,以及 fx -可以为段中的任何点计算的函数。 如Wikipedia所写,某个整数是一个平面上带有符号的区域 x 受时间表限制 f 轴心 x 和垂直线 x=x=b图1a )。

这个概念在逻辑上扩展到了更大的维度:对于某些双积分, 带有符号区域变为带有符号体积图1b ),并且通常对于某些多重积分,它变为带有符号多维体积


图1:某些积分的例子。

在某些情况下,可以通过分析确定面积,例如 fx=2 :在细分市场上 [ab] 面积相等 2ba 。 在其他情况下,例如当我们需要找出水面上冰山部分的体积时( 图1c ),就不可能采用解析解决方案。 在这种情况下 fx 通常可以通过抽样确定。

数值积分


我们可以使用数值积分来近似计算复杂积分的面积。 一个例子是黎曼和 。 通过将区域划分为规则形状(例如矩形)来计算此数量,规则形状一起形成类似于真实区域的区域。 黎曼和定义如下:

 tag1S= sumni=1fxi Deltaxi


n 是子间隔的数量,并且  Deltaxi= fracban -一个子间隔的宽度。 对于每个间隔 我们取样 f 在某一点上 xi 在子间隔内(在图2中,此点位于子间隔的开始)。


图2:黎曼和。

值得注意的是,随着 n 黎曼和收敛到积分的实值:

\标2 intbafxdx= lim|| Deltax||\到0 sumni=1fxi Deltaxi


黎曼和也可以用于大尺寸( 图3 )。 但是,这里我们面临一个问题:对于具有两个参数的函数,如果要获得与二维情况下可使用的分辨率相当的分辨率,则子间隔的数量应大得多。 这种现象称为尺寸诅咒 ,而在更高的尺寸中 ,这种现象会加剧。


图3:双积分的黎曼和。

现在,我们将评估以下函数的黎曼和的准确性(我们有意选择了一个复杂函数):

 tag3fx=\左| sin\左 frac12x+ frac pi2 right tan fracx27+ sin\左 frac35x2 right+ frac4x+ pi+11\右|


段上的功能图 [2.5,2.5] 如下所示。 作为参考,我们在Wolfram Alpha中计算了某个积分  int2.52.5fx 到达区域 3.12970 。 右图显示了使用黎曼和求和的数值积分精度 n


图4:函数图和黎曼和精度。 即使小 n 我们得到一个相当准确的结果。

为了获得准确性的概念,我们给出数字: n=50 错误是 2 times103 。 在 n=100 错误是 3 times104 。 可以得到以下数量级 n=200

有关黎曼金额的更多信息,请参见以下资源:


蒙特卡洛(1)


渲染时,几乎没有(也许根本没有?)积分是单个的 。 这意味着我们将很快遇到维度的诅咒。 此外,以相等的间隔对一个函数进行采样会 导致 采样失真 不足 :我们可以跳过该函数的重要值,或者在采样的函数和采样模式之间获得意外的相互干扰( 图5 )。


图5:失真会导致部分采样函数丢失(红色),在这种情况下,会导致对函数的完全错误解释。

使用称为Monte Carlo积分的技术可以解决这些问题。 类似于黎曼和,它在一组点上也使用函数采样,但是与确定性黎曼和模式不同,我们使用根本上不确定的成分:随机数。

蒙特卡洛积分基于以下观察结果:可以用随机实验的期望值代替积分:

\标4 intbafxdx=baE\左[fX\右]\大 fracban sumni=1fX


换句话说,我们对函数进行采样 n 段中任意点的时间(用大写字母表示) X ),对样本求平均值,然后乘以线段的宽度(对于一维函数)。 就像黎曼和一样, n 到无穷大,样本的平均值收敛到期望值,即积分的真实值。

一点概率论


了解此处使用的每个概念很重要。 让我们从等待开始:这是单个样本的期望值。 请注意,这不一定是可能的值,这似乎违反直觉。 例如,当我们掷骰子时,期望等于 3.5 -所有可能结果的平均值: 1+2+3+4+5+6/6=21/6=3.5

第二个概念是随机数 。 这看起来似乎很明显,但是对于蒙特卡洛积分,我们需要均匀分布的随机数,即 每个值都应具有相等的生成概率。 稍后我们将详细讨论。

第三个概念是偏差及其相关的方差 。 即使我们采用少量数字,预期平均值以及每个样本的预期值也应相同。 但是,在计算方程式4时,我们很少得到这样的值。 偏差是期望与实验结果之间的差异: XEX

实际上,这种偏差具有有趣的分布:


这是正态分布高斯分布的图形:它表明并非所有偏差均可能。 实际上,大约有68.2%的样品在此范围内 1 sigma..1 sigma 在哪里  sigma (sigma)是标准偏差 。 标准偏差可以用两种方式描述:

  • 标准偏差是数据变异性量度
  • 95%的数据点在 2\西西 从平均水平。

有两种确定标准偏差的方法:

  1. 标准偏差  sigma= sqrt frac1n sumni=1\左XiE\左[X\右]\右2 :可以计算是否存在离散的概率分布并且期望值是已知的 E[X] 。 这对于其中的多维数据集是正确的 X=1,2,3,4,5,6E[X]=3.5 。 代入数字,我们得到  sigma=1.71
  2. 同样,样品的标准偏差可以计算为  sigma= sqrt frac1n1 sumni=1\左XiX\右2 。 在Wikipedia上阅读有关此内容的更多信息。

检查:这是正确的吗? 如果  sigma=1.71 ,我们声明68.2%的样本在3.5的1.71之内。 我们知道 2,3,4,5 满足此条件,并且 16 -不 六分之四为66.7%。 如果我们的多维数据集可以在区间中产生任何[1..6] ,那么我们将获得准确的68.2%。

代替标准偏差,相关的方差概念被定义为 Var\左[X\右]= sigma2 。 由于使用了平方,因此方差始终为正,这有助于计算。


蒙特卡洛(2)


上面,我们使用黎曼和求和近似计算了方程3 。 现在,我们使用蒙特卡洛积分重复该实验。 回想一下蒙特卡洛积分的定义如下:

\标5 intbafxdx=baE\左[fX\右]\大 fracban sumni=1fX


让我们将其转换为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样本处的蒙特卡洛误差

在较大的尺寸中,这种差异会减小,但不会完全消除。 下面显示的等式是上面使用的等式的扩展版本,具有两个参数:

fxy=\左| sin\左 frac12x+ frac pi2 right tan fracx27+ sin\左 frac16x2\右+ frac4x+ pi+11\右|\左| 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 intbafxdx=baE\左[fX\右]\大 fracban sumni=1 fracfXpX


在这里 pX概率密度函数(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.40.6 反映需求的可能性 x< frac12 等于70% 整合pdf时 [0.. frac12]1.4\次 frac120.6 times frac12 等于 0.3 。 这说明了所有pdf的一个重要要求:集成pdf的结果为1。另一个要求是 px 如果不能为零 fx 非零:这意味着零件 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为我们提出了两项​​任务:

  1. 如何创建这样的pdf文件;
  2. 如何采样这样的pdf?

这两个问题的答案是相同的: 我们不需要这样做。 在许多情况下,我们要集成的功能是未知的,而确定重要位置的唯一方法是对其进行采样,为此,我们需要pdf。 “鸡肉和鸡蛋”的经典情况。

但是,在其他情况下,我们对函数可以给出较高值或零值的位置有一个大概的了解。 在这种情况下,非常粗糙的pdf通常比没有pdf更好。

另外,我们可能有机会即时创建pdf。 几个样本给出了函数形式的概念,在此基础上,我们将后续样本定位到我们希望获得较高值的地方,这些地方将用于改善pdf等。

在下一篇文章中,我们将把这些概念应用于渲染实现。 一个严重的挑战是建立pdf。 我们研究了pdf有助于抽样的几种情况。

Source: https://habr.com/ru/post/zh-CN480926/


All Articles