last modified: 2018-04-11 03:07:00
このページではMathJaxによる数式表示を行っています。対応しているブラウザーであれば少し待てば数式が表示されます。
(画面左下にMathJaxのタイプセットステータスが表示されます。)
環境によっては表示が崩れているかもしれません。その際はブラウザーを変更してみてください。
Under Construction

このページは未完成です。

Disney Principled BRDF

このページでは、Disney Principled BRDFについて紹介します。

はじめに

SIGGRAPH 2012においてDisneyによりDisney principled BRDF [Burley2012]が紹介されました。シュガーラッシュ(原題:Wreck-It Ralph)を始めとする映画制作に実際に用いられており、アーティストによる直感的な制御が可能なようにパラメターが設定されています。Disneyによる資料には同BRDFのコンセプトについては記述されているものの、BRDFの全体像が示されていませんでした。同じくDisneyにより提供されているBRDF Explorer [Disney2012]というツールに同BRDFの実装があるので、そこから全体像を書き出してみます。

BRDFの全体像

Disney principled BRDFは幅広い材質の表現をカバーするために、アーティストが調整可能なパラメターとして次の11種類が提供されています。

  • $ baseColor $: 物体表面の色を表す。
  • $ subsurface $: 拡散BRDFの振る舞いを理想拡散と表面下散乱近似との間で調整する。
  • $ metallic $: 金属度合いを表す。0なら誘電体、1なら金属 = 導体となる。金属は拡散反射成分を持たず、ベース色のスペキュラー反射となる。
  • $ specular $: 非金属の場合のスペキュラー反射を調整する。0の場合でもグレージング角ではスペキュラー反射は存在する。
  • $ specularTint $: 非金属の場合のスペキュラー反射色を調整する。1の場合ベース色となるが、グレージング角では無色となる。
  • $ roughness $: 物体表面の粗さを表す。拡散反射とスペキュラー反射両方に影響する。
  • $ anisotropic $: スペキュラーハイライトの異方性度合いを表す。
  • $ sheen $: グレージング角における追加要素。主に布の表現に使われる。
  • $ sheenTint $: $ sheen $ 成分の色をベース色に近づける度合い。
  • $ clearcoat $: 2つ目のスペキュラーローブの強さを表す。
  • $ clearcoatGloss $: クリアコートの光沢を調整する。

$ baseColor $ のみが色を表すパラメターで、それ以外は全てスカラーです。

Disney principled BRDFは複数のBRDFによる複合BRDFとなっており、次に示すように主に5種類のBRDFに分けて考えることができると思います。 \begin{eqnarray*} \newcommand\lerp{\mathrm{lerp}} \newcommand\subsurface{\color{cyan}{subsurface}} \newcommand\metallic{\color{cyan}{metallic}} f_r(\vomega_i, \vomega_o) &=& \Brc{\lerp\Prt{{f_\mathrm{diffuse}(\vomega_i, \vomega_o),\; f_\mathrm{subsurface}(\vomega_i, \vomega_o),\; \subsurface}} + f_\mathrm{sheen}(\vomega_i, \vomega_o)} (1 - \metallic) + \vphantom{0} \\ && f_\mathrm{specular}(\vomega_i, \vomega_o) + f_\mathrm{clearcoat}(\vomega_i, \vomega_o) \end{eqnarray*} ここで、$ \lerp $ は線形補間関数であり、1つ目と2つ目の引数の要素を3つ目の引数(基本的には $ [0, 1] $)の数値によって割合を変えて補間します。次に各要素BRDFについて示します。 \begin{eqnarray*} \newcommand\FRSchlick{F_{r,\, \mathrm{Schlick}}} \newcommand\FTSchlick{F_{t,\, \mathrm{Schlick}}} \newcommand\baseColor{\color{cyan}{baseColor}} \newcommand\specular{\color{cyan}{specular}} \newcommand\specularTint{\color{cyan}{specularTint}} \newcommand\roughness{\color{cyan}{roughness}} \newcommand\anisotropic{\color{cyan}{anisotropic}} \newcommand\sheen{\color{cyan}{sheen}} \newcommand\sheenTint{\color{cyan}{sheenTint}} \newcommand\clearcoat{\color{cyan}{clearcoat}} \newcommand\clearcoatGloss{\color{cyan}{clearcoatGloss}} f_\mathrm{diffuse}(\vomega_i, \vomega_o) &=& \frac{\baseColor}{\pi} \cdot \FTSchlick(\vomega_i, F_{D90}(\theta_d)) \; \FTSchlick(\vomega_o, F_{D90}(\theta_d)) \\ f_\mathrm{subsurface}(\vomega_i, \vomega_o) &=& \frac{\baseColor}{\pi} \cdot 1.25 \cdot \Brc{\FTSchlick(\vomega_i, F_{SS90}(\theta_d)) \; \FTSchlick(\vomega_o, F_{SS90}(\theta_d)) \Prt{\frac{1}{\cos \theta_i \cos \theta_o} - 0.5} + 0.5} \\ f_\mathrm{sheen}(\vomega_i, \vomega_o) &=& \sheen \cdot \rho_\mathrm{sheen} \cdot (1 - \vomega \cdot \vec{h})^5 \\ f_\mathrm{specular}(\vomega_i, \vomega_o) &=& \frac{\FRSchlick(\vomega, F_{S0}) \, D_{GGXaniso}(\vec{h}, \alpha_\mathrm{specular, x}, \alpha_\mathrm{specular, y}) \, G_{GGXaniso}(\vomega_i, \vomega_o, \alpha_\mathrm{specular, x}, \alpha_\mathrm{specular, y})}{4 \cos \theta_i \cos \theta_o} \\ f_\mathrm{clearcoat}(\vomega_i, \vomega_o) &=& 0.25 \cdot \clearcoat \cdot \frac{\FRSchlick(\vomega, 0.04) \, D_{Berry}(\vec{h}, \alpha_\mathrm{clearcoat}) \, G_{GGX}(\vomega_i, \vomega_o, 0.25)}{4 \cos \theta_i \cos \theta_o} \\ \end{eqnarray*} $ \theta_d $ はハーフベクトル $ \vec{h} $ とベクトル $ \vomega_i $ もしくは $ \vomega_o $ のなす角度です。
その他の各要素の定義は以下のようになっています。 \begin{eqnarray*} \FTSchlick(\vomega, F_{90}) &=& 1 + (F_{90} - 1) (1 - \vomega \cdot \vec{n})^5 \\ \FRSchlick(\vomega, F_{0}) &=& F_{0} + (1 - F_{0}) (1 - \vomega \cdot \vec{h})^5 \\ F_{D90}(\theta_d) &=& 0.5 + 2 \cdot \roughness \cdot \cos^2 \theta_d \\ F_{SS90}(\theta_d) &=& \roughness \cdot \cos^2 \theta_d \\ \rho_\mathrm{sheen} &=& \lerp(1,\; \rho_\mathrm{tint},\; \sheenTint) \\ \rho_\mathrm{specular} &=& \lerp(1,\; \rho_\mathrm{tint},\; \specularTint) \\ \rho_\mathrm{tint} &=& \frac{\baseColor}{Y(\baseColor)} \\ F_{S0} &=& \lerp(0.08 \cdot \specular \cdot \rho_\mathrm{specular},\; \baseColor,\; \metallic) \\ \alpha_\mathrm{specular, x} &=& \max(0.001, \roughness^2 \; / \; aspect) \\ \alpha_\mathrm{specular, y} &=& \max(0.001, \roughness^2 \cdot aspect) \\ aspect &=& \sqrt{1 - 0.9 \cdot \anisotropic} \\ \alpha_\mathrm{clearcoat} &=& \lerp(0.1,\; 0.001,\; \clearcoatGloss) \end{eqnarray*} $ Y(color) $ は $ color $ の輝度値を求める関数です。シアンの色の単語はDisney principled BRDFのパラメターです。$ \lerp $ の1, 2個目の一方の引数いずれかが色を表していて、もう一方が数値となっている場合、その数値は実際には全要素同じ値の色として扱います。

その他メモ

  • BRDF Explorerの実装ではマイクロファセットBRDFの分母の $ 4 \cos \theta_i \cos \theta_o $ がshadowing-masking functionである $ G $ 項に含まれている。
  • 元の文献ではベース層のマイクロファセットの粗さが $ \roughness $ を用いて $ (0.5 + 0.5 \cdot \roughness)^2 $ として設定されると書いてありますが、BRDF Explorerのコミットログによると、上に示した実装に変更されているようです。
    => 元の文献に修正&追記版 (v3)があり、資料の最後に言及があります。
  • $ F_{S0} $ 中の0.08という数値は屈折率1.8の垂直反射率に相当。クリアコート層のフレネル項の垂直反射率0.04は屈折率1.5に相当。
  • Disney principled BRDFやそのサブセットが、Physically Based Renderingの文脈でよく使用されているため、「物理的に正しい」といった説明がされていることがありますが、同BRDFはエネルギー保存則や相反性に「大体」則っているだけで、むしろアドホックな調整が多く「物理的に尤もらしく見えやすい」程度の説明が適切です。

Unreal Engine 4 BRDF

「Real Shading in Unreal Engine 4」(SIGGRAPH 2013) [Karis2013]より。
UE4のPBRモデルで採用されたBRDFはDisney principled BRDFのサブセットとなっており、次に示す4つのパラメターを持ちます。

  • $ baseColor $
  • $ metallic $
  • $ specular $
  • $ roughness $

BRDFの全体像は次のように2つのBRDFから構成されます。 \begin{eqnarray*} \newcommand\lerp{\mathrm{lerp}} \newcommand\baseColor{\color{cyan}{baseColor}} \newcommand\metallic{\color{cyan}{metallic}} \newcommand\roughness{\color{cyan}{roughness}} \newcommand\cavity{cavity} \newcommand\specular{\color{cyan}{specular}} f_r(\vomega_i, \vomega_o) &=& f_\mathrm{diffuse}(\vomega_i, \vomega_o)(1 - \metallic) + f_\mathrm{specular}(\vomega_i, \vomega_o) \end{eqnarray*} 各要素BRDFは次のように表されます。 \begin{eqnarray*} f_\mathrm{diffuse}(\vomega_i, \vomega_o) &=& \frac{\baseColor}{\pi} \\ f_\mathrm{specular}(\vomega_i, \vomega_o) &=& \frac{F_r(\vomega, F_{S0}) \, D_{GGX}(\vec{h}, \alpha) \, G_{{GGX}'}(\vomega_i, \vomega_o, k)}{4 \cos \theta_i \cos \theta_o} \\ \end{eqnarray*} その他の各要素の定義は以下のようになっています。 \begin{eqnarray*} F_r(\vomega, F_{0}) &=& \begin{cases} F_{0} + (1 - F_{0}) (1 - \vomega \cdot \vec{h})^5 & \mbox{Schlick} \\ F_{0} + (1 - F_{0}) 2^{(-5.55473(\vomega \cdot \vec{h}) - 6.98316)(\vomega \cdot \vec{h})} & \mbox{Spherical Gaussian} \end{cases} \\ F_{S0} &=& \lerp(0.08 \cdot \specular,\; \baseColor,\; \metallic) \\ \alpha &=& \roughness^2 \\ G_{{GGX}'}(\vomega_i, \vomega_o, k) &=& G_{{GGX1}'}(\vomega_i, k) \; G_{{GGX1}'}(\vomega_o, k) \\ G_{{GGX1}'}(\vomega, k) &=& \frac{\vec{n} \cdot \vomega}{(\vec{n} \cdot \vomega)(1 - k) + k} \\ k &=& \frac{\alpha}{2} \end{eqnarray*}

その他メモ

  • フレネル項はSchlick近似でも良いが、exp2組み込み命令を使えばSpherical Gaussian近似がわずかに効率が良くなるらしい。
  • shadowing-masking function $ G_{{GGX}'} $ はオリジナルのGGXに付随するSmith近似ではなく、さらにそのSchlick近似が使われている。
  • $ \specular $ パラメターは混乱を招くという理由で $ \cavity $ パラメターに名称変更されています(デフォルト値も1に変更、0.08ではなく0.04が掛けられるようになった?Disney BRDFと同じくデフォルト値0.5と0.08のままかもしれない)。
    結局 $ \cavity $ は採用されず $ \specular $ パラメターが使われるようになったらしいです[Karis2014]。
  • $ \specular $ パラメターは基本的には固定値0.5。
  • shadowing-masking function $ G_{{GGX}'} $ で使ったと書いてある"hotness"修正も結局無しに[Karis2014]。
  • 2018/2/27時点のUE4のシェーダーソースコードを見ると、shadowing-masking functionがheight-correlated Smithモデルの近似に更新されているようです。また、フレネル項のグレージング角における反射率の調整(詳細は後述のFrostbite 3.0 BRDFにて)も追加されています。
  • Unreal Engine 4のリリースノートを見ると、DiffuseモデルはUE 4.8で一度Disney BRDFと同じBurley Diffuseに変更されたものの、4.9で再度Lambertに戻されたようです。

Frostbite 3.0 BRDF

「Moving Frostbite to Physically Based Rendering 3.0」(SIGGRAPH 2014) [Lagarde2014]より。
Frostbite 3.0のPBRモデルで採用されたBRDFはDisney principled BRDFのサブセットとなっており、次に示す4つのパラメターを持ちます。

  • $ BaseColor $
  • $ MetalMask $: Disney BRDFの $ metallic $ と同じだが、基本的には二値であることをアーティストに示唆するために名前が変更されている。
  • $ Reflectance $: Disney BRDFの $ specular $ と基本的には同じだが、値のマッピングが異なる。
  • $ Smoothness $: Disney BRDFの $ roughness $ に相当するが、アーティストにとって値が1のときにスムースな面という方が直感的であったため値のマッピングは反転される。

BRDFの全体像は次のように2つのBRDFから構成されます。 \begin{eqnarray*} \newcommand\BaseColor{\color{cyan}{BaseColor}} \newcommand\MetalMask{\color{cyan}{MetalMask}} \newcommand\Reflectance{\color{cyan}{Reflectance}} \newcommand\Smoothness{\color{cyan}{Smoothness}} f_r(\vomega_i, \vomega_o) &=& f_\mathrm{diffuse}(\vomega_i, \vomega_o)(1 - \MetalMask) + f_\mathrm{specular}(\vomega_i, \vomega_o) \end{eqnarray*} 各要素BRDFは次のように表されます。 \begin{eqnarray*} f_\mathrm{diffuse}(\vomega_i, \vomega_o) &=& \frac{\BaseColor}{\pi} \cdot \FTSchlick(\vomega_i, F_{D90}(\theta_d)) \; \FTSchlick(\vomega_o, F_{D90}(\theta_d)) \cdot \lerp\Prt{1, \frac{1}{1.51}, {roughness}} \\ f_\mathrm{specular}(\vomega_i, \vomega_o) &=& \frac{F_r(\vomega, F_{S0}) \, D_{GGX}(\vec{h}, \alpha) \, G_{{GGX}''}(\vomega_i, \vomega_o, \alpha)}{4 \cos \theta_i \cos \theta_o} \\ \end{eqnarray*} その他の各要素の定義は以下のようになっています。 \begin{eqnarray*} \FTSchlick(\vomega, F_{90}) &=& 1 + (F_{90} - 1) (1 - \vomega \cdot \vec{n})^5 \\ \FRSchlick(\vomega, F_{0}) &=& F_{0} + (1 - F_{0}) (1 - \vomega \cdot \vec{h})^5 \\ F_{D90}(\theta_d) &=& 0.5 \cdot roughness + 2 \cdot roughness \cdot \cos^2 \theta_d \\ F_{S0} &=& \lerp(0.16 \cdot \Reflectance^2,\; \BaseColor,\; \MetalMask) \\ \alpha &=& {roughness}^2 \\ roughness &=& 1 - \Smoothness \\ G_{{GGX}''}(\vomega_i, \vomega_o, \alpha) &=& \frac{\chi^+(\vomega_o \cdot \Vec{h}) \chi^+(\vomega_i \cdot \Vec{h})}{1 + \Lambda(\vomega_i, \alpha) + \Lambda(\vomega_o, \alpha)} \\ \Lambda(\vomega, \alpha) &=& \frac{-1 + \sqrt{1 + \alpha^2 \tan^2(\theta)}}{2} = \frac{-1 + \sqrt{1 + \frac{\alpha^2(1 - (\vomega \cdot \Vec{n})^2)}{(\vomega \cdot \Vec{n})^2}}}{2} \end{eqnarray*}

その他メモ

  • diffuse項がDisney BRDFのものに置き換えられ、さらにエネルギー保存則を満たすように正規化項が掛けられている。
  • shadowing-masking function $ G_{{GGX}''} $ はGGXの元論文にあるSmith近似(uncorrelated)より発展的なheight-correlated Smithが使われている。
  • 上記ではグレージング角におけるフレネル反射率が常に100%になるように書いているが、$ F_{S0} $ が0.02より小さくなるような $ \Reflectance $ パラメターの値を渡した場合は、フレネル反射率にmicro-specular occlusionを考慮した特殊な制御が入る。が、それについては現時点では書いていない。

参考文献

  1. [Burley2012] Brent Burley - "Physically-Based Shading at Disney", 2012
  2. [Disney2012] BRDF Explorer
  3. [Karis2013] Brian Karis - "Real Shading in Unreal Engine 4", 2013
  4. [Karis2014] Brian Karis - "Physically Based Shading on Mobile", 2014
  5. [Lagarde2014] Sébastien Lagarde, Charles de Rousiers - "Moving Frostbite to Physically Based Rendering 3.0", 2014
Under Construction

このページは未完成です。


Today : 00000021 Total : 00127984
Copyright © 2019 shocker.