mh采样算法推导_重要性采样小结

ada983ef57bdb226f7703f39687b5dc4.png

最近在看一篇讲SSR的PPT,里面提到了根据GGX分布做重要性采样,其实之前或多或少的了解过重要性采样算法,不过当时没有认真的总结过这个问题,也没有想过要认真的推导相关的公式。这篇给文章的主要目的就是给看过的一些文章做个总结,推导一下相关的公式,以免自己会忘记。接下来会分几个步骤介绍一下与重要性采样相关的内容。

一、NDF表示的是什么?

NDF从字面意思来看表示的是法线分布函数(Normal Distribution Function),但是具体表示的是什么?单位是什么呢?细心的同学可能会发现,如果直接对NDF进行积分,得到的结果很可能不为1,出现这个结果的原因是NDF表示的并不是法线的概率密度函数。

从How Is The NDF Really Defined? 这篇文章里面可以看到NDF表示的是当前点的微表面(microfacet)的面积除以宏表面(macrofacet)的面积,然后再除以立体角。所以NDF的单位是立体角分之一。

2eacc47d83650dffede649801f1550a5.png

上图中h表示的微表面的法线,n表示宏表面的法线。在GGX的那篇论文中NDF遵循如下公式:

(1)

在这篇文章中也提到了NDF的归一化条件:

(2)

二、 Blinn重要性采样算法

Blinn的NDF定义如下:

(3)

根据式(2)可知

,因此
即可表示Blinn的概率密度函数,为了方便计算,将其转换到球面上面来,我们可以得到其在球面坐标下的概率密度函数:

(4)

由于这个概率密度函数有2个参数,我们需要分别计算边缘概率密度函数。

(5)

根据公式(5),计算关于

的累计概率函数CDF。

(6)

计算

的边缘概率密度:

(7)

根据公式(7)得到关于

的累计概率函数CDF。

(8)

根据公式(6)和(8)得到的累计概率函数,假设由0-1均匀采样得到的变量为

,设

(9)

根据公式(9)可以得到采样结果为:

(10)

至此我们得到了关于Blinn的重要性采样结果。

三、GGX重要性采样

由于在上一节中加了过多的说明性的文字,这一节和上一节基本相差不大,所以只列出公式,不在写过多的文字说明。

GGX的NDF为:

(11)

将其转换到球面上的概率密度函数表示为:

(12)

分别求边缘概率密度,得到:

(13)

的采样结果与上面的一致,为
,接着我们求
的采样结果,同样我们需要先求CDF。

(14)

解公式

,得到

贴一下UE4中GGX重要性采样的代码,可以看到和我们推导的结果是一样的:

d86122839e7faea9cf1f4b4b6f333cd5.png

上面的代码中计算出来的PDF是D * CosTheta,D * CosTheta也就是 D* NoH,这个是没有问题的,但是很多时候我们会看到下面的代码,下面的代码中使用的pdf与我们推导的不太一样,这个的主要原因就是我们使用GGX重要性采样得到的是H向量,pdf表示的也是H向量的分布,但是下面的图中需要采样的是L向量的,所以这个pdf就需要根据雅可比行列式进行转换,将H的分布概率转换为L的概率分布,更加具体的推导可以参考[5]。

b8240a0b824bd06d913a33e3d65f9fbb.png

为了方便回顾这些内容,就把论文中的一部分内容贴到下面吧。

cea5568289f4912ced7b484860c9bee1.png

94df745ae658b49d281a84d20cdb48be.png

9e2a1da0ce4924aff39d8a1f803b2a5d.png

到这里,基本上就已经知道如何根据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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值