地图点随机分布均匀_球谐光照与PRT学习笔记(二):蒙特卡洛积分与球面上的均匀采样...

e771837b7f4bbd6838e1a4c64746c98a.png
鸡哥:球谐光照与PRT学习笔记(一):引入​zhuanlan.zhihu.com
cc9860f7cfbe322420259a7ab580fed5.png

这一节依旧是铺垫的内容。蒙特卡洛积分(Monte-Carlo integration)在其他地方都会用到,例如Monte-Carlo Ray Tracing(还有很多其他领域的数值计算的应用)。因为这系列学习笔记的主题是SH Lighting,所以还会讲讲如何在球面上均匀采样(uniform sampling)以及对球面函数的蒙特卡洛积分。

上一节也提到过,球谐的投影(Projection)操作就跟傅立叶变换比较类似,只不过球谐函数是定义在球面

上的。那么类似的,
SH Projection也需要在球面定义域上用球谐函数核做卷积。而函数本体一般就是某点周围的一些光照、遮挡等GI相关的信息,但一般情况下都无法得到这个积分的解析式,所以得用数值方法来求解了。

蒙特卡洛积分的思路

1.设变量

服从给定概率密度函数
,那么函数
的数学期望就是:

2.如果我们想要用数值方法去估计一个积分式

的值,我们可以通过一个骚操作变形:

把一个积分问题转化为求数学期望的问题,analytical的不好搞那就尽量numerical吧。数学期望其实可以用足够多的样本来近似估计,也就是:

其中

就是样本个数了。这个其实就有点像题图那样紫的思路,疯狂砸点去采样,最后得到一个近似的结果。

096cf91ea1e66cdd79caa379f735e011.png

这个思路还是挺简单的,但是注意在球谐光照的应用里面,Monte-Carlo integration的被积函数是定义在球面

上的!!如果给定两个独立的、在
取值的均匀随机变量(uniform random variable)
(这个用c++标准库的<random>里面的随机数引擎可以搞),那么我们用下面的映射就可以产生在球面上均匀分布的采样方向

80e0266e98bb1e8bb5f4c389c372992c.png
图:球坐标参数化

怎么在球面上的均匀采样*(笔者注)*

其实上面说的在球面上均匀采样的映射的表达式看得我一愣一愣的,[1]什么都没解释,就留下一条式子和因为菜而在电脑屏幕前目瞪口呆的我。所以我决定填一下这个小坑。

找到一片很nice的英文文章,给你解释了怎么生成在球面上均匀分布的采样[2]:

Generating uniformly distributed numbers on a sphere​corysimon.github.io
59f200a361aceec858249e25701a68e0.png

下面的内容在符号记法上跟原文有一点不同。文章说了一下,如果我们直接给

赋两个标准随机变量的话:

产生的采样不会是均匀分布在球面上的,而是在两个极点处比较密集:

aa27918e9d9678c35fdd07905e6ee0e2.png

这个其实还挺直观的,这就相当于我们拿很多条纬线去套住这个球,而每条纬线上都有等量的点,那明显在极点附近的纬线圈半径变小,也就使得极点附近的点更加密集了。

1c5e58e9789412461bd8da69cf0944a6.png

这是因为单位面积微元

不是一个常量,而是跟
有关。那么很明显在
附近面积微元比较小,也就造成了样本密度比较大。那么我们得想办法构造一下,使得单位面积微元里面的样本密度在球面上都保持一致。

因为球面的表面积

,然后我们希望的是,概率密度
是个常数,所以我们要
使得
,其中
是采样方向。

那么我们在一个面积微元

里面采样的概率是:

因为我们希望

这里的概率密度函数

用了两种方式参数化。

又因为我们采样的球面函数可以直接当作是在单位球上的,所以:

所以用方位角

来参数化的概率密度函数为:

我们求这个二维独立随机变量的概率密度函数(probability density function)的边缘密度函数(marginal density function):

再求一波边缘分布函数(marginal distribution function):

上面的边缘分布函数是我们想要的理想结果的结论,是基于“使得在球面上每点采样的概率密度

”推导出来的。

.

接下来我们需要一个数学工具,用均匀分布变量构造出一个给定分布的概率分布函数(Cumulative Distribution Function, CDF)。文章给出的能做到这件事的东西,就是Inverse Transform Sampling[3]:

https://en.wikipedia.org/wiki/Inverse_transform_sampling​en.wikipedia.org
fc112c0a55175c4bd2f53207a49c4972.png

Inverse transform sampling

Inverse transform sampling​en.wikipedia.org
fc112c0a55175c4bd2f53207a49c4972.png

这玩意的意思是,可以给定一个均匀分布变量

,再给定一个我们想要生成的连续随机变量
及它的理想的分布函数
,我们有:

使得

,则

Inverse Transform Sampling的具体推导可以看看维基百科。

有了这个东西,我们就可以给定均匀分布变量

,构造一波 :

使得

这一波构造关键就在于求解概率分布函数的反函数,那么很明显:

的反函数是

的反函数是

于是通过下面的映射就可以产生在球面上均匀分布的采样了:

.

PS: 但是再注意一下,这一节推出的映射和上文以及[1]原文的说法不一样,上文的是:

后来我用google画了一下图像发现是一个东西........根据这个三角函数和反三角函数的运算法则[4],可以推得:

所以下面两种映射都可以从两个独立的标准均匀分布变量生成在球面上均匀分布的变量

93dbf543ddd458123458fb1dcc29f16d.png
图:[1]中的图,最后的采样分布大致如此

引用

[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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值