八叶一刀·无仞剑

万物流转,无中生有,有归于无

导航

GGX重要性采样

Posted on 2020-10-09 21:10  闪之剑圣  阅读(2551)  评论(4编辑  收藏  举报

在之前的文章里面,我们介绍了Cook-Torrance BRDF,这是一种常见的用于表现PBR的光照模型。今天我们想要解决的问题是,在该BRDF下,给定物体材质的粗糙度(roughness),该如何生成符合该粗糙度的采样方向呢(这对于路径追踪采样生成入射光、IBL算法中采样计算radiance都很重要)?

法向分布函数(NDF)

对GGX的采样主要是针对它的法向分布函数NDF来进行的。在之前的文章中,我们曾经简单地介绍过法向分布函数的概念,它是一个用来描述微面元模型中各个微面的法向分布密度的函数。该函数实际的意义是当前点的微表面(microfacet)的面积除以宏表面(macrofacet)的面积,然后再除以立体角,所以NDF的单位是立体角分之一。
但是如果直接对NDF针对立体角dw积分的话,得到的结果其实并不是1,也就是说NDF实际上并不是法线的概率密度函数。
真正的归一化公式如下:

\(\LARGE \int D(m)cos(\theta_m)d\omega=1\)

其中D是法向分布函数,m是某个微面元的法向,\(\theta_m\)则是微面元的法向和宏观表面法向的夹角,\(\omega\)是该微面元所属的立体角。这个公式其实就是将微面元的面积映射到了宏表面上,如下图所示:

也就是说,如果上面的积分中没有这个\(cos\theta\),那么得到的其实是微表面面积之和和宏表面之比。
更详细的理论推导可以参考这篇文章:How Is The NDF Really Defined?
通过上面的公式可知,\(D(m)cos(\theta_m)\)才是真正关于微表面法线的概率密度函数。

关于GGX的重要性采样

知道了概率密度函数p,我们就可以根据它进行采样。在这里我们以GGX的NDF为例。
GGX的NDF形式如下:
\(\large{NDF-GGX(n,h,\alpha)=\frac{{\alpha}^2}{\pi {( {cos\theta}^2 ({\alpha}^2 - 1) + 1)}^2}}\)
将它转换为球坐标系的概率密度函数为:

\(\large{p(\theta,\phi)=\frac{{\alpha}^2 cos\theta sin\theta}{\pi {( {cos\theta}^2 ({\alpha}^2 - 1) + 1)}^2}}\)

\(\theta\)\(\phi\)的边缘概率密度函数,得:

进一步求得\(\theta\)\(\phi\)的CDF:
\(\LARGE P_h(\phi)=\frac{\phi}{2\pi}\)

设两个[0,1]之间的随机数\(\xi\)\(\epsilon\)分别对应\(P_h(\phi)\)\(P_h(\theta)\),可以解得(其实用得就是逆方法):
\(\LARGE \phi = 2\pi\xi\)
\(\LARGE \theta = arccos\sqrt{\frac{1-\epsilon}{\epsilon(\alpha^2 - 1) + 1}}\)

可以看到UE4中的GGX采样也是用该思路来计算的: