上个星期在做SSAO时遇到了这个问题。众所周知SSAO在最早(就是孤岛危机1那会)是在球上采样的,但这导致了结果非常不正确,不该有遮挡的地方很灰很灰,于是在孤岛危机2时就出现了在半球上采样的改进版。我在shader中写了个特别简单的半球采样,代码大概如下:
vec3 sample_on_hemiSphere(vec3 seed)
{
vec3 randVec3 = vec3(
hash(seed.x) * 2 - 1,
hash(seed.y),
hash(ssed.z) * 2 - 1
);
/*
hash return in (-1,1)
*/
return normalized(randVec3);
}
简单来说就是在[-1,1] * [0,1] * [-1,1]的空间上生成了一个随机三维向量,然后再进行归一化。我觉着这应该是个均匀采样吧
然后我在RT Gem上看到了这个半球均匀采样,Amazing!
我看了半天没想明白为什么作者说这个式子是uniform的,而且一点都不straightforward。
幸运的是我在PBRT 13.6找到了答案,这次就记录一下。
不多说了,开始推导
PDF是概率密度函数,CDF是累积分布函数。
我们使用逆分布函数法生成采样点。我们先想办法拿到PDF。回忆球面积分的知识,在采样域半球上对pdf积分得,$\int P(\omega )d\omega = 1$
补个概率论知识:在pdf的全域上积分为1
又因为均匀分布的pdf为常数,所以可以得到
$P(\omega)\int d\omega=1$
则PDF为$P(\omega)=\frac{1}{2\pi}$
又因为$d\omega=sin\theta d\theta d\phi$
且$\int P(\omega )sin\theta d\theta d\phi=\int P(\theta,\phi)d\theta d\phi$
可证得$P(\theta,\phi)=\frac{sin\theta}{2\pi}$
对于一个联合二维密度函数p(x,y),当其x与y独立时,有
$p(x,y)=p(x)p(y)$
但很可惜,大部分有用的PDF其x与y都不是独立的,这时候我们可以先对其中一个变量积分,求出其边缘概率密度
$p(x)=\int p(x,y)dy$
可以理解为X的单独的PDF,但准确的说,这代表了X在所有能取到的Y上的密度。
接着求y的条件概率密度$p(y|x)=\frac{p(x,y)}{p(x)}$
照着这个思路就可以求出
$p(\theta)=\int_{0}^{2\pi}p(\theta,\phi)d\phi=sin\theta$
$p(\phi|\theta)=\frac{p(\theta,\phi)}{p(\theta)}=\frac{1}{2\pi}$
我们要让采样的点符合pdf,就是pdf大的地方采样点多,pdf小的地方采样的点少。
这就可以引申出来第一种采样方法,拒绝采样(reject sampling),简单来说,我们在一大片区域中随机取点,落在pdf曲线内就接受,反之拒绝,假设取点是均匀的,那么得到的采样点集必然是符合pdf的。
这是个对标准正态分布拒绝采样的例子
设随机取到的点为$(x,y)$,如果$y < p(x)$,那么就接受,反之拒绝。
我选择了[-2,2]*[0,0.5]作为一个大的采样区间,但还是有许多点被拒绝了,显而易见,这与我选上界有关,而且正态分布越两边pdf越小,被拒绝的概率也就越大。
其实可以把采样的上界换成一个简单,并且恒大于pdf的曲线,这个曲线$q(x)$称为参考函数,则
$\frac{q(x)}{p(x)} = k (k>1)$
只要两个曲线贴合的比较紧密,就能减少无效的点。
回到问题上,我们只需要对$\theta,\phi$进行采样,然后根据其与xyz的关系就能拿到坐标了。
但这样....会不会有点太烦了,即使咋样选择曲线,总是会有无效的点。
这带来了第二种采样方法,逆变换采样(Inverse transform sampling)
这种方法需要我们拿到cdf,然后算出反函数,在反函数上取随机点。
但很可惜许多cdf没有解析解或者即使是计算机算起来也太慢了,举个例子,上过概率论的都记得正态分布的PDF,但谁记得正态分布的CDF呢(笑)。于是只能回到拒绝采样
证明推导在wiki上,自行查看。
先对$\phi,\theta$的pdf积分,求出cdf
$P(\theta)=\int_{0}^{\theta}sin\theta d\theta=1-cos\theta\Rightarrow\theta=\arccos(1-\xi_1)$
$P(\phi|\theta)=\int_{0}^{\phi}\frac{1}{2\pi}d\phi=\frac{\phi}{2\pi}\Rightarrow\phi=2\pi\xi_2$
$\xi_1,\xi_2$为(0,1)上的随机数。
然后由x,y,z与$\phi,\theta$的关系,我们就能得到这个式子。
$(\sqrt{1-\xi^2} \cos(2\pi\xi_2),\sqrt{1-\xi^2} \sin(2\pi\xi_2),\xi_1)$
此处用了$\xi_1$代换$\xi_1-1$
至此推导完毕,如有错误劳烦指出
1.Physically Based Rendering-13.6 2D Sampling with Multidimensional Transformations
2.wikipedia-Inverse transform sampling
3.wikipedia-Rejectionsampling