图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)

时间:2024-05-22 20:15:02

作者:i_dovelemon
日期:2017/07/29
来源:****
主题:Monte Carlo Integration

引言

好久没有写博客了,最近一直在忙于工作,同时GLB库中关于PBR的渲染算法,一直卡住,无法实现下去。不过在这段时间,阅读了大量关于PBR的论文,有了一点心得,所以今天在这里和大家分享下,在准备实现PBR中,所需要准备的一些数学基础知识。

今天要和大家分享的是在解渲染方程中,最常使用的一种数学积分方法-基本蒙特卡罗尔积分,后面会陆陆续续补充一些基于此方法的优化手段。

蒙特卡罗尔积分

假设我们有一个函数f(x),我们无法通过分析的方法直接求出如下的积分:

π0f(x)dx
,那么当我们需要知道该积分的值的时候,又该怎么办了?

聪明的科学家们,想出了一些近似的方法来求出该积分,其中在图形学里面被经常用到的就是蒙特卡罗尔积分。

我们假设,下图就是函数f(x)[0,π]上的曲线:

图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)

求这个函数在[0,π]上的积分,实际上就是求曲线与x轴在[0,π]所围图形的面积,如下图所示:

图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)

由于这个图形是一个不规则的图形,想要简单的求出面积基本不可能。但是我们知道,对于该面积,当我们将[0,π]的长度π作为宽的时候,必然存在某个值h,使得函数与x轴围成的面积等于A=πh,即下图所示:

图形学数学基础之基本蒙特卡罗尔积分(Monte Carlo Integration)

所以,对于求该函数的积分,就变成了如何求出一个h值,使得他们的面积相同。

实际上,由于宽度为π,就是函数f(x)的作用域,那么高度h很自然的就是整个函数在[0,π]上的平均值。

所以,最后问题就变成了:如何较准确的求出函数在[0,π]范围里面的平均值。对于该问题,图形学里面是通过采样的方式来进行预估的。

虽然前面我们说过对于
π0f(x)dx
,我们没有分析的方法去计算出它的值,但是对于函数f(x)的值,却可以用带入参数的方法,直接计算出来。有了这个前提,我们就能够在函数的作用域范围里面随机的选择参数x的值,然后精确的计算出f(x)的值。

当然,仅仅只通过选取一个随机值,计算出的f(x)值,与实际的函数f(x)的平均值可能相距甚远,所以,我们需要在[0,π]的范围里面,生成大量的随机值,计算f(x)的值,并且将所有这些f(x)的值求一个平均数,就能够得到一个近似的h值了。

上面这段话应该很容易理解,当我们随机采样的数量趋近于无限的时候,这些随机样本所形成的f(x)的平均值,就等于精确的h。当然,在实际情况下,我们无法生成无限的随机样本,所以,误差总是不可避免的。所以现在图形学关于这块的研究,就是如何在有限的样本情况下,使用最少的样本数量,更快的计算出更小误差的h值。

关于函数f(x)的基本蒙特卡罗尔积分,就可以用一个公式来概括,即:
π0f(x)dxπNi=1Nf(xi)


同时,我们可以得出更加通用的公式:
baf(x)dxbaNi=1Nf(xi)

总结

这一次通过一个简单的实例,讲解了基本蒙特卡罗尔的方法,下一次将要讲解,图形学里面,常用的优化手段,能够让我们使用更少的样本,更快的计算出,比较精确的积分值。

参考文献

[1] Ray Tracing From the Ground Up, by Kevin Suffern
[2] Physically Based Rendering From Theory to Implementation, Third Edition, by Matt Pharr,Wenzel Jakob,Greg Humphreys