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

3D引擎 同时被 3 个专栏收录
51 篇文章 2 订阅
61 篇文章 1 订阅
23 篇文章 0 订阅

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

引言

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

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

蒙特卡罗尔积分

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

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

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

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

函数f(x)的函数曲线

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

函数f(x)与x轴围成的面积

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

黄色图像面积与蓝色图像面积一致

所以,对于求该函数的积分,就变成了如何求出一个 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

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值