Microfacet 微平面模型是广泛应用的对rough surface建模的工具,基本上生产和科研里用到的那些耳熟能详的模型,blinn,ward,beckmann都属于microfacet的推导结果。基本思想也很简单,就是用很小的微平面的组合去模拟粗糙的物体表面。而这些微小的平面元则可以当做完美的反射或者折射表面。

理论上的Microfacet模型应该包含了实际的粗糙表面所有光学行为包括反射折射。不过实际上在production的渲染中应该是把镜面高光和漫反射分离--仅仅是为了方便调整。这里的讨论和总结只针对一般情况,既完整的BRDF表达式。

1.Mircrofacet distribution function

我们用一个关于法向量m的函数D来描述微平面的分布情况,而这个函数关于立体角的积分就等于物体的表面积,当然它肯定大于或者等于物体的宏观表面积:

请输入图片描述

请输入图片描述

分布函数D基本上决定了Microfacet模型BRDF的形状和性质,我们所说的Blinn, GGX 也就是这些分布的名称。

2. Shadowing-Masking function G

函数G是一个双向函数,也就是说:

G(i,o,m) = G(o,i,m)

实际上函数G对最终的BRDF形状影响很小,在重要性采样的时候一般也会忽略之,不过G还是必要的,主要为了表面反射和折射的能量守恒。

一般用到的G函数有beckmann推导的G:

请输入图片描述

3. BSDF的推导

我们把每个微平面的scattering行为看成完美镜面反射或者折射,然后对微平面m向量积分,就可以得到BSDF的表达式:

请输入图片描述

在G 和 D 的表达式都已知的情况下我们只要把fs用纯镜面的函数来表示就可以了,具体参考光学书籍里计算fresnel反射和fresnel折射的公式,有一点需要注意的就是这个积分是关于m向量的,而实际上BRDF或者BTDF函数都是关于出射光线方向向量的,所以这里需要做一个转换,也就是高数上说的计算雅克比行列式:

请输入图片描述请输入图片描述

对于镜面反射,法向量就是出射和入射向量的半角向量,如下图:

请输入图片描述

可算出:

请输入图片描述

对于折射来说,由半角向量推导出出射向量会稍微复杂:

请输入图片描述

请输入图片描述

最后可以得到的行列式为:

请输入图片描述

代入那个积分的式子,可以得到BSDF表达式。

反射:

请输入图片描述

折射:

请输入图片描述

4.重要性采样

在采样Microfacet BSDF的时候,我们一般是按照D函数的形状去分布采样点,因为D导致了BSDF结果绝大部分的variance,而且BSDF表达式本身是由三个函数的乘积构成,按照它去重要性采样是不可能的。

具体采样的办法可以参考上一篇博文,采样得到半角向量m之后,再反推出出射向量。

5.结果比较

实际上各种BSDF在渲染中的差别没有那么大,调整参数都能出类似的效果,实际仪器测量BSDF的具体参数显然是最靠谱的模拟一种表面的方法,当然也有很多科研人员是这么干的,不过在production里显得不那么实际。

Phong:

请输入图片描述

Blinn:

请输入图片描述

GGX:

请输入图片描述


Wentao_Wang
136 声望54 粉丝

引用和评论

0 条评论