MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

在上一篇文章中,介绍了基于信号角度、利用滤波器实现的反走样方法,其基本工具为傅里叶分析,但理想滤波器难以实现,具有其局限性。本节中,我们将介绍一些反走样方法,并引入利用采样计算积分的蒙特卡洛方法。

基于超采样的反走样方法

超采样(Supersampling)

渲染时将图片分辨率扩大若干倍,得到高分辨率有锯齿的图像,再将这种更高频率的采样样本进行下采样(低通滤波)得到所求分辨率的图片。

5 1024x399 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

通过选取良好的滤波器,可以有效去除其高频分量,得到走样较少的结果。但这种方法仍无法解决高频分量比超采样频率更高的情况,且对重复性纹理效果不佳(摩尔纹)。

6 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

多重采样(Multisampling)

多重采样是对超采样的一种优化。超采样会将所有的计算量扩大若干倍,而多重采样只是在光栅化(测试可见性)时提高采样频率,而计算颜色、获取纹理的次数并不增加。

7 1024x232 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

加入抖动的超采样

超采样依然无法根本解决高频信号的问题,很可能提高了采样频率依然没有办法得到正确的结果,导致摩尔纹的发生。而有一种方法可以缓解此问题,就是引入抖动,即不在每个像素的中心采样,而是引入一个随机偏移。

8 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

泊松盘采样

与上面的采样方法不同,这种方法通过随机算法生成采样点。在这种方法里,要求采样点之间的距离不能小于 r,这可以通过扔飞镖算法实现,即随机生成点之后,确认点是否满足了距离要求,丢弃不满足的结果并重新生成。

9 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法
10 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

满足距离要求的一组采样点的分布被称为“蓝噪声”,其特征是频域不包含低频分量,且为各向同性分布(各方向的频率分量相同)。

自适应超采样

包含高频分量的像素中会得到方差较大的一组样本,因此可以对方差大的像素多采集一些样本,从而更好地处理区域内的高频信号。也可以使用相对相邻像素的方差来判断,可以更好地覆盖几何边界。

11 1024x698 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

不一致分布的问题

基于随机算法生成的采样点可能集中于某一区域,造成最终结果的偏差。这可以通过多层重建来解决,将像素划分为更小的区域,分别在每个区域中利用样本值计算颜色值,最终再将小区域进行下采样,得到像素的最终颜色。

12 1024x464 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

蒙特卡洛积分

蒙特卡洛积分是一种利用采样估计积分值的方法。例如,我们想求出 π 的值,可以在正方形中套入 1/4 个圆,并在正方形内取采样点,计算在 1/4 圆中的采样点数量占比。样本在圆内的概率为 π/4,故可以用样本占比估计概率。

13 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

蒙特卡洛的估计值与真实值之间的误差与样本数有关,提高样本数,估计值会逐渐收敛至真实值。这种方法不仅适用于图中的二维积分,更广泛适用于各种积分,是一种通用的估计技术。但同时也存在问题,例如更多样本带来的更多计算等。

蒙特卡洛积分的分析

假设使用蒙特卡洛方法计算积分 $I=\int_a^b f(x) \mathrm{d}x$,对于一个在 $[a,b]$ 上均匀分布的随机变量 $x$,令积分区间长度为 1,则有

$$ E[f(x)]=\int_a^b f(x) \cdot \dfrac{1}{b-a} \mathrm{d}x=\int_a^b f(x) \mathrm{d}x = I $$

这说明,我们可以将积分转换为期望运算。我们取 $N$ 个独立且都是均匀分布的随机变量 $x_i$,构造 $F_N=\dfrac{1}{N} \sum_{j=1}^N f(x_i)$,由期望的线性性质有 $E[F_N]=E[f(x)]$。这说明,利用 N 个样本值求函数值的平均数之期望与积分相等。

我们再来计算这种估计方法的方差,由于样本是独立随机变量,其协方差为 0,方差为 $\sigma^2[F_N]=\dfrac{\sigma^2[f(x)]}{N}$。这说明,虽然估计的方差不为 0,但当样本数 $N \rightarrow 0$ 时方差可以取 0,这是一种一致的估计。

非均匀分布的蒙特卡洛积分

利用上面的分析过程,容易得到对于概率密度为 $p(x)$ 的随机变量 $x$,其对积分的蒙特卡洛方法估计值为

$$ \langle I \rangle = \frac1N \sum_{i=1}^N \frac{f(x_i)}{p(x_i)} $$

可以通过期望的定义来证明此结果。这种情况多见于特殊材质的 BRDF,如毛玻璃效果的如下。

14 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

在这种 BRDF 中,向主要反射方向附近追踪更多光线能得到更好的结果。选择合适的随机变量分布可以使结果收敛得更快。

另外,有时样本的分布不均匀,会造成结果的误差,可以类似上文那样划分区域,并在规范化的区域中生成随机数。

15 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

蒙特卡洛积分的优缺点

优点:可以计算各种积分,使用通用方便

缺点:收敛慢,当样本数少时容易引入噪声,难以实现

14 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

基于蒙特卡洛方法的全局光照

蒙特卡洛光线追踪

16 1024x611 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

对一个像素追踪一条光线,在反射时生成多条采样光线,以此类推。每条光线在最后对光源采样,得到颜色值,并根据蒙特卡洛积分公式计算像素颜色值。

蒙特卡洛路径追踪

17 1024x603 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

对一个像素追踪多条光线,在反射时只生成一条采样光线,以此类推。

在这些光线追踪方法中应用重要性采样可以减少渲染结果中的噪声。

与辐射度方法的区别

辐射度方法是一种有限元方法,其思想基于对要渲染的区域离散化为若干区域,再利用辐射度矩阵求解每个区域的颜色。这种方法与视角无关,生成的结果可用于不同视角观察场景的渲染结果。

蒙特卡洛方法基于采样对渲染公式积分值的估计,由于需要生成光线,光线起点与视角有关。

辐射率缓存

18 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法

间接光照的结果是平滑的,因此不用每次都重新计算颜色值,而是将以前计算过的值缓存起来,在计算接近这些缓存点的值时利用插值得到近似结果。

光子映射

光子映射方法可以解决蒙特卡洛光线追踪中与视角有关的问题。其思想从光路反转开始,每次从光源投射出多条光线,并在光线与场景交点处保存辐射度、入射方向等信息(光子信息),这些光子同样可以看做场景中的一些光源,照亮剩下的部分。渲染时从预处理的光子信息中求出渲染点附近的若干光子,并计算这些光子对该点的贡献。这种方法可以与辐射率缓存等方法结合使用,以更好的优化计算效率。

19 1024x613 - MIT 6.837:Sampling & Monte Carlo Integration 采样与蒙特卡洛方法


发表回复

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据