跳转至

法线分布函数

引言

具体可参阅:《微平面模型》

根据微表面模型的理论,在微观尺度下,任何一个平面都可以看成由N个微平面所组成的。

如果 微平面的朝向 与 半程向量 的方向越一致,镜面反射的效果越是强烈和锐利。

法线分布函数就是帮我们计算出,有百分之几的微平面 和 半程向量 的方向一致。

举个例子

  • 给定一个半程向量\(h\),和一个粗糙度
  • 如果微平面中有35%与\(h\)方向一致
  • 则法线分布函数(NDF)将会返回0.35

法线分布函数

法线分布函数,Normal Distribution Function

  • 从统计学上,近似地表示了与某些(半程)向量\(h\)方向一致的微平面的比率

给定一个粗糙度参数,目前有很多NDF都可以从统计学上来估算微平面的总体取向度

  • 常用的是Trowbridge-Reitz GGX

Trowbridge-Reitz GGX

Trowbridge-Reitz GGX是法线分布函数的一种

  1. \(h\) 半程向量
  2. \(a\)表面粗糙度
  3. \(n\)平面法线
\[ NDF_{GGX TR}(n, h, \alpha) = \frac{\alpha^2}{\pi((n \cdot h)^2 (\alpha^2 - 1) + 1)^2} \]

假设\(h\)\(n\)不变,粗糙度从0.1至1.0取值,NDF数值如下所示

  1. 当粗糙度很低(表面很光滑)时,与半程向量方向一致的微平面会高度集中在一个很小的区域内。由于这种集中性,NDF最终会生成一个非常明亮的斑点
  2. 当表面比较粗糙的时候,微平面的取向方向会更加的随机(微平面排列的很随意)。你将会发现与\(h\)向量取向一致的微平面分布在一个大得多的半径范围内,但同时较低的集中性也会让我们的最终效果显得更加灰暗

GLSL

float D_GGX_TR(vec3 N, vec3 H, float a)
{ 
    float a2 = a*a; 
    float NdotH = max(dot(N, H), 0.0); 
    float NdotH2 = NdotH*NdotH; 

    float nom = a2; 
    float denom = (NdotH2 * (a2 - 1.0) + 1.0); 
    denom = PI * denom * denom; 

    return nom / denom; 
}