math-math记录

从小到大最拿手的科目, 中间遗忘了一段时间, 没想到工作中竟然还能用到, 重新捡起来.


前篇


在线可视化工具


傅里叶变换


蒙特卡罗尔积分

Monte Carlo Integration

关于函数f(x)f(x)的基本蒙特卡罗尔积分,就可以用一个公式来概括,即:
$$
\int_{0}^{\pi} f(x) \mathrm{d} x \approx \frac{\pi}{N} \sum_{i=1}^{N} f\left(x_{i}\right)
$$
同时,我们可以得出更加通用的公式:
$$
\int_{a}^{b} f(x) \mathrm{d} x \approx \frac{b-a}{N} \sum_{i=1}^{N} f\left(x_{i}\right)
$$


Hammersley采样

在图形学里面,用到了很多的采样算法。特别当你在写一个光线追踪器的时候,会使用大量的采样算法来对BRDF,光源等进行采样。这些采样操作,一般是先通过创建一个具有均匀分布的2D随机点集合,然后通过变换,将这些2D随机点变换到具体的采样数据上去,如BRDF的方向等等。关于这部分变换和相应的原理,后面会有相应的章节来讲解,今天我们先来了解一个在实现PBR中,经常被使用到的均匀分布的2D随机采样方式–Hammersley采样。

Hammersley采样,听上去好像很深奥的样子,实际上是一个十分简单的操作。

我们知道,在计算机里面大量使用了二进制来表示数据,如下表所示的一些十进制与二进制的对应关系:

十进制 二进制
1 1
2 10
3 11
4 100

而Hammersley采样就是利用计算机使用二进制表示的特性,来构造均匀分布的2D随机采样点。它是通过对一个二进制数进行Radical
Inverse方法,来构造出一个值来实现的。它的过程如下表:

十进制 二进制 Radical Inverse
1 1 .1 = 1 * 1/2 0.5
2 10 .01 = 0 * 1/2 + 1 * 1/4 0.25
3 11 .11 = 1 * 1/2 + 1 * 1/4 0.75
4 100 .001 = 0 * 1/2 + 0 * 1/4 + 1 * 1/8 0.125

从上表可以看到,Radical Inverse方法,就是简单的将给定的十进制数的二进制表示方法,反过来放在小数点之后,构造一个在[0,1]之间的值。

在明白了Radical Inverse方法之后,我们就可以构造hammersley的2D随机分布的采样点集合,如下所示:

为了方便,这里同时给出GLSL的代码,便于大家参考:

1
2
3
4
5
6
7
8
9
10
11
12
float RadicalInverse(uint bits) {
bits = (bits << 16u) | (bits >> 16u);
bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
return float(bits) * 2.3283064365386963e-10f;
}

vec2 Hammersley(uint i, uint N) {
return vec2(float(i) / float(N), RadicalInverse(i));
}

重要性采样

Importance Sampling

如何通过对基本蒙特卡罗尔积分方法进行改进,从而加快求解积分的速度。所以,今天就来和大家讲解在图形学里面,一种非常重要的加快积分的手段-重要性采样(Importance Sampling)。

我们先回顾下基本蒙特卡罗尔积分的内容,如下所示:
$$
\int_{a}^{b} f(x) \mathrm{d} x \approx \frac{b-a}{N} \sum_{i=0}^{N-1} f\left(x_{i}\right)
$$

新的积分器函数
$$
\int_{a}^{b} f(x) \mathrm{d} x \approx \frac{1}{N} \sum_{i=0}^{N-1} \frac{f\left(x_{i}\right)}{p\left(x_{i}\right)}
$$

同时,从我们新的积分器,也能够得出前面一篇文章中讲解的基本蒙特卡罗尔积分器来,只要将:
$$
p(x)=\frac{1}{b-a}
$$
带入新的积分器中,就能够得到。