![ada983ef57bdb226f7703f39687b5dc4.png](https://i-blog.csdnimg.cn/blog_migrate/9b678a1697cc8e3b8e952acae45958d4.jpeg)
最近在看一篇讲SSR的PPT,里面提到了根据GGX分布做重要性采样,其实之前或多或少的了解过重要性采样算法,不过当时没有认真的总结过这个问题,也没有想过要认真的推导相关的公式。这篇给文章的主要目的就是给看过的一些文章做个总结,推导一下相关的公式,以免自己会忘记。接下来会分几个步骤介绍一下与重要性采样相关的内容。
一、NDF表示的是什么?
NDF从字面意思来看表示的是法线分布函数(Normal Distribution Function),但是具体表示的是什么?单位是什么呢?细心的同学可能会发现,如果直接对NDF进行积分,得到的结果很可能不为1,出现这个结果的原因是NDF表示的并不是法线的概率密度函数。
从How Is The NDF Really Defined? 这篇文章里面可以看到NDF表示的是当前点的微表面(microfacet)的面积除以宏表面(macrofacet)的面积,然后再除以立体角。所以NDF的单位是立体角分之一。
![2eacc47d83650dffede649801f1550a5.png](https://i-blog.csdnimg.cn/blog_migrate/eeabcb492c4289e0ee03f0c9daa2e71c.jpeg)
上图中h表示的微表面的法线,n表示宏表面的法线。在GGX的那篇论文中NDF遵循如下公式:
在这篇文章中也提到了NDF的归一化条件:
二、 Blinn重要性采样算法
Blinn的NDF定义如下:
根据式(2)可知
由于这个概率密度函数有2个参数,我们需要分别计算边缘概率密度函数。
根据公式(5),计算关于
计算
根据公式(7)得到关于
根据公式(6)和(8)得到的累计概率函数,假设由0-1均匀采样得到的变量为
根据公式(9)可以得到采样结果为:
至此我们得到了关于Blinn的重要性采样结果。
三、GGX重要性采样
由于在上一节中加了过多的说明性的文字,这一节和上一节基本相差不大,所以只列出公式,不在写过多的文字说明。
GGX的NDF为:
将其转换到球面上的概率密度函数表示为:
分别求边缘概率密度,得到:
解公式
贴一下UE4中GGX重要性采样的代码,可以看到和我们推导的结果是一样的:
![d86122839e7faea9cf1f4b4b6f333cd5.png](https://i-blog.csdnimg.cn/blog_migrate/5c2bdb4b37712d92475428fd8ee9be55.jpeg)
上面的代码中计算出来的PDF是D * CosTheta,D * CosTheta也就是 D* NoH,这个是没有问题的,但是很多时候我们会看到下面的代码,下面的代码中使用的pdf与我们推导的不太一样,这个的主要原因就是我们使用GGX重要性采样得到的是H向量,pdf表示的也是H向量的分布,但是下面的图中需要采样的是L向量的,所以这个pdf就需要根据雅可比行列式进行转换,将H的分布概率转换为L的概率分布,更加具体的推导可以参考[5]。
![b8240a0b824bd06d913a33e3d65f9fbb.png](https://i-blog.csdnimg.cn/blog_migrate/1fa7c271c5309ce504bb30c1fc441c90.jpeg)
为了方便回顾这些内容,就把论文中的一部分内容贴到下面吧。
![cea5568289f4912ced7b484860c9bee1.png](https://i-blog.csdnimg.cn/blog_migrate/002e2a78ec0acd801e8e4009962b0e6b.jpeg)
![94df745ae658b49d281a84d20cdb48be.png](https://i-blog.csdnimg.cn/blog_migrate/0179cc8f522cc833f1e8bdad5430296a.jpeg)
![9e2a1da0ce4924aff39d8a1f803b2a5d.png](https://i-blog.csdnimg.cn/blog_migrate/3d77df727b3188737ec56dbbf399e871.jpeg)
到这里,基本上就已经知道如何根据NDF得到相应的重要性采样方法。
PS:这篇文章前前后后写了有1个月了,一直在草稿箱里面,今天终于写完了,不得不说知乎的
参考文献:
[1]http://www.reedbeta.com/blog/hows-the-ndf-really-defined/
[2]https://agraphicsguy.wordpress.com/2015/11/01/sampling-microfacet-brdf/
[3]http://www.irisa.fr/prive/kadi/Lopez/ashikhmin00anisotropic.pdf
[4]https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch20.html]
[5]https://www.graphics.cornell.edu/~bjw/wardnotes.pdf