这一节依旧是铺垫的内容。蒙特卡洛积分(Monte-Carlo integration)在其他地方都会用到,例如Monte-Carlo Ray Tracing(还有很多其他领域的数值计算的应用)。因为这系列学习笔记的主题是SH Lighting,所以还会讲讲如何在球面上均匀采样(uniform sampling)以及对球面函数的蒙特卡洛积分。
上一节也提到过,球谐的投影(Projection)操作就跟傅立叶变换比较类似,只不过球谐函数是定义在球面
蒙特卡洛积分的思路
1.设变量
2.如果我们想要用数值方法去估计一个积分式
把一个积分问题转化为求数学期望的问题,analytical的不好搞那就尽量numerical吧。数学期望其实可以用足够多的样本来近似估计,也就是:
其中
这个思路还是挺简单的,但是注意在球谐光照的应用里面,Monte-Carlo integration的被积函数是定义在球面
怎么在球面上的均匀采样*(笔者注)*
其实上面说的在球面上均匀采样的映射的表达式看得我一愣一愣的,[1]什么都没解释,就留下一条式子和因为菜而在电脑屏幕前目瞪口呆的我。所以我决定填一下这个小坑。
找到一片很nice的英文文章,给你解释了怎么生成在球面上均匀分布的采样[2]:
Generating uniformly distributed numbers on a spherecorysimon.github.io下面的内容在符号记法上跟原文有一点不同。文章说了一下,如果我们直接给
产生的采样不会是均匀分布在球面上的,而是在两个极点处比较密集:
这个其实还挺直观的,这就相当于我们拿很多条纬线去套住这个球,而每条纬线上都有等量的点,那明显在极点附近的纬线圈半径变小,也就使得极点附近的点更加密集了。
这是因为单位面积微元
因为球面的表面积
那么我们在一个面积微元
因为我们希望
这里的概率密度函数
又因为我们采样的球面函数可以直接当作是在单位球上的,所以:
所以用方位角
我们求这个二维独立随机变量的概率密度函数(probability density function)的边缘密度函数(marginal density function):
再求一波边缘分布函数(marginal distribution function):
上面的边缘分布函数是我们想要的理想结果的结论,是基于“使得在球面上每点采样的概率密度
.
接下来我们需要一个数学工具,用均匀分布变量构造出一个给定分布的概率分布函数(Cumulative Distribution Function, CDF)。文章给出的能做到这件事的东西,就是Inverse Transform Sampling[3]:
https://en.wikipedia.org/wiki/Inverse_transform_samplingen.wikipedia.orgInverse transform sampling
Inverse transform samplingen.wikipedia.org这玩意的意思是,可以给定一个均匀分布变量
使得
Inverse Transform Sampling的具体推导可以看看维基百科。
有了这个东西,我们就可以给定均匀分布变量
使得
这一波构造关键就在于求解概率分布函数的反函数,那么很明显:
于是通过下面的映射就可以产生在球面上均匀分布的采样了:
.
PS: 但是再注意一下,这一节推出的映射和上文以及[1]原文的说法不一样,上文的是:
后来我用google画了一下图像发现是一个东西........根据这个三角函数和反三角函数的运算法则[4],可以推得:
所以下面两种映射都可以从两个独立的标准均匀分布变量生成在球面上均匀分布的变量
引用
[1] Green R. Spherical harmonic lighting: The gritty details[C]// Game Developers Conference. 2003
[2] Generating uniformly distributed numbers on a sphere
[3] Inverse transform sampling
[4] ] https://zh.wikipedia.org/wiki/%E5%8F%8D%E4%B8%89%E8%A7%92%E5%87%BD%E6%95%B0