(本文内容主要来自《pbrt》13.5、13.6)
如果y满足概率密度分布p(y),如果要随机地获取一个y的话,可以先获取一个随机数t,然后代入它的累积概率密度P(y)=t,然后求解出y即可。
但是很多情况需要的不仅是对单个变量做采样,往往需要对多个维度下的多个变量进行采样,而这些多个变量之间很有可能有互相关联,并且直接采样也不容易,可以考虑做一些变换来进行采样。
一切推导从一个最基本的式子出发,y和x的累积概率密度CDF相同,P{Y<=y(x)}=P{X<=x}
因此Py(Y)=Px(X)
两边做一下微分即可得:p(y)dy/dx=p(x)
那么如果y和x都是多维的情况,很容易就可以得到p(y)Jy(x)=p(x),Jy(x)是y关于x的雅克比行列式。
具体的例子:
1.圆面上进行均匀采样。
圆面上的任何一点可以由直角坐标系下的(x,y)表达,也可以由极坐标系下的(r,θ)来表达,并且存在关系:x=rcosθ,y=rsinθJ=∣∣∣∣cosθsinθ−rsinθrcosθ∣∣∣∣=r
因此可以得到关系rp(x,y)=p(r,θ)
由于要求在圆面上进行均匀采样,也就是说每一点被采到的概率都应该相同,p(x,y)=1/π,那么p(r,θ)=πr,进一步可以得到p(r)=∫02ππrdθ=2r
由此p(θ∣r)=p(r,θ)/p(r)=2π1
这个结果可以看出θ和r是互相独立的,因此可以分别获取两个随机数a,b,最终的采样结果为:r=a,θ=2πb
2.半球面上对立体角做均匀采样
立体角被定义为单位球面上的单位面积,于是dw=dA=sinθdθdϕ(dA为单位球上的微元面积),因此p(w)sinθ=p(θ,ϕ)
而要求对立体角做均匀采样,于是p(w)=2π1
即p(θ,ϕ)=sinθ/2π
进一步p(θ)=∫02πsinθ/2πdϕ=sinθ
于是p(ϕ∣θ)=2π1
可取两个随机数a,b,这样可以得到ϕ和θ:ϕ=2πa,θ=cos−1b
进一步代入直角坐标系可以得到x,y,z
3.半球面上对立体角做Cosine-Weighted采样
Cosine-Weighted采样指的是立体角方向与竖直方向夹角的余弦值越高,那么该立体角被采样得到的概率就越大的一种采样方式。
也就是说p(w)=cosθ⋅c,其中c是一个常系数
由于对整个半球面做积分,得到值应该为1:∫H2c⋅cosθdw=1
代入计算可以得到c=π1,直接使用2的推导可以得到p(θ,ϕ)=p(w)sinθ=πsinθcosθ
继续往后推导就可以得到具体采样的公式。
但是这里有一个更加简单的方法
如图所示,只需要现在圆面上进行一次采样得到黑色的点,然后把它往上投影到球面上即可。
下面来证明其正确性,也就是要证明通过这样的采样方式是符合p(θ,ϕ)=πsinθcosθ的。
在二维球面上采样可以获得p(r,ϕ)=πr,不难发现r=sinθ,于是p(sinθ,ϕ)=πr
考虑将p(sinθ,ϕ)变换至p(θ,ϕ),可得雅克比行列式J=∣∣∣∣cosθ001∣∣∣∣=cosθ
因此p(θ,ϕ)=Jp(sinθ,ϕ)=πsinθcosθ
这说明这种方法采样得到的结果是符合Cosine-Weighted采样要求的。