BRDF常用高光项模型
在基础的BRDF当中,我们推到出了基础的BRDF公式结构:
D项:法线分布函数用来描述,法线方向在表面上的分布情况,积分结果为1。
G项:用来描述Shadow和masking项。用来描述不同的几何结构有多少光线被遮挡。
F项:用来描述在不同材质,不同角度上,反射光线所占的比例。
下面来分析不同的的实现,主要从博客翻译而来:
首先,UE4和unity HDRP当中对于roughness的计算都有一些特别。
例如UE,当中参与计算的roughness为:
unity HDRP当中使用的是smoothness,最终参与计算的roughness为:
法线分布函数NDF
法线分布函数主要用来描述高光分布,也是用来描述微表面朝向的分布。所以他的半球积分为1:
其中m为半角,并且每一项都有一个$ \frac{1}{\pi \alpha^2} $ 因子。
Blinn-Phong
Beckmann
GGX (Trowbridge-Reitz)
GGX Anisotropic
几何结构项Geometric Shadowing
几何结构项描述了微表面的对于光线的遮挡关系,他是一个对光线的削减比例,所以不需要满足积分为1。对光线遮挡的比例依赖于粗糙度和微表面分布(NDF)。
Implicit
### Neumann
Cook-Torrance
Kelemen
Smith方法描述的几何结构项
Smith方法根据不同的法线分布函数NDF,来构造对应的结构遮挡。Smith把遮挡拆分成了两项:灯光和视线,他们使用同一个函数。
下面根据不同的NDF来给出对应的$ G_1 $
Blinn-Phong
没有对应的$ G_1 $,建议使用Beckmann的$ G_1 $。
Beckmann
GGX
Schlick-Beckmann
Schlick-GGX
菲涅尔Fresnel
菲涅尔主要用来描述在不同的入射角度上,给出一个折射率(index of refraction),计算反射和折射的比例。
菲涅尔的规律是:入射角越大,光线反射比例越大。
通常我们使用的输入参数不是折射率(IoR),而是垂直入射时的反射比$ F_0 $,并且通常隐含了如果入射角度接近90度,那么反射比会趋近于1($ F_{90} = 1$)。
None
Schlick
目前Unity使用的就是这种。
Cook-Torrance
优化
由于brdf计算过于复杂,brdf通常需要优化,优化方案通常有以下几种:
- 将brdf作为一个整体进行约分化简。
- 使用预计算,把计算结果存储在贴图当中。
- 简化brdf公式,使用brdf公式的lod策略。
References
[1] Hoffman 2013,
“Background: Physics and Math of Shading”
[2] Blinn 1977, “Models of light reflection for computer synthesized pictures”
[3] Beckmann 1963, “The scattering of electromagnetic waves from rough surfaces”
[4] Walter et al. 2007,
“Microfacet models for refraction through rough surfaces”
[5] Burley 2012,
“Physically-Based Shading at Disney”
[6] Neumann et al. 1999,
“Compact metallic reflectance models”
[7] Kelemen 2001,
“A microfacet based coupled specular-matte brdf model with importance sampling”
[8] Smith 1967, “Geometrical shadowing of a random rough surface”
[9] Schlick 1994,
“An Inexpensive BRDF Model for Physically-Based Rendering”
[10] Karis 2013,
“Real Shading in Unreal Engine 4”
[11] Cook and Torrance 1982,
“A Reflectance Model for Computer Graphics”
[12] Reed 2013,
“How Is the NDF Really Defined?”