PBR Specular D 法線分佈 NDF

法線分佈項(Specular D):GTR

  • D爲微平面分佈函數,主要負責鏡面反射波峯(specular peak)的形狀。(反射波峯的形狀)
  • 正態分佈函數D,或者說鏡面分佈,從統計學上近似的表示了與某些(中間)向量h取向一致的微平面的比率。

image.png

  • Disney Principled BRDF中使用了兩個固定的鏡面反射波瓣(specular lobe),且都使用GTR模型,能夠總結以下:
    • 主波瓣(primary lobe)
      • 使用γ= 2的GTR(即GGX分佈)
      • 表明基礎底層材質(Base Material)的反射
      • 可爲各項異性(anisotropic) 或各項同性(isotropic)的金屬或非金屬
    • 次級波瓣(secondary lobe)
      • 使用γ= 1的GTR(即Berry分佈)
      • 表明基礎材質上的清漆層(ClearCoat Layer)的反射
      • 通常爲各項同性(isotropic)的非金屬材質,即清漆層(ClearCoat Layer)
  • GGX比其餘分佈具備更長的尾部,但仍然沒法捕捉到鉻金屬(chrome)樣本的閃亮亮點。
  • chrome 、GGX和Beckmann分佈的點光源響應

image.png

公式

公式1

  • image.png
    • 只與粗糙度有關?(202課上說)
    • a表示表面粗糙度
    • h 當成是不一樣粗糙度參數下,平面法向量和光線方向向量之間的中間向量的話
      • image.png
  • 計算正態分佈函數網上代碼
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;
}
複製代碼

公式2

  • 如下是γ= 1和γ= 2時GTR分佈的Shader實現代碼:
// Generalized-Trowbridge-Reitz distribution
float D_GTR1(float alpha, float dotNH)
{
    float a2 = alpha * alpha;
    float cos2th = dotNH * dotNH;
    float den = (1.0 + (a2 - 1.0) * cos2th);

    return (a2 - 1.0) / (PI * log(a2) * den);
}

float D_GTR2(float alpha, float dotNH)
{
    float a2 = alpha * alpha;
    float cos2th = dotNH * dotNH;
    float den = (1.0 + (a2 - 1.0) * cos2th);

    return a2 / (PI * den * den);
}
複製代碼

以及各項異性的版本:chrome

float D_GTR2_aniso(float dotHX, float dotHY, float dotNH, float ax, float ay)
    {
            float deno = dotHX * dotHX / (ax * ax) + dotHY * dotHY / (ay * ay) + dotNH * dotNH;
            return 1.0 / (PI * ax * ay * deno * deno);
    }
複製代碼
相關文章
相關標籤/搜索