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:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。