リハビリ

大分浦島太郎状態なので,リハビリのためのメモ。

読んでおくべき文献

レンダリング方程式

[Chandrasekhar 1960] S. Chandrasekhar, “Radiative Transfer”, Dover Publications, 1960.

[Kajiya and Von Herren 1984], James T. Kajiya, Brian P. Von Herren, “Ray Tracing Volume Densites”, Computer Graphics 18,3, pp.165-174, 1984.

クリックしてace5526aeec3c2e099a5f2431ba48a2a43c0.pdfにアクセス

[Kajiya 1986] James T. Kajiya, “The Rendering Equation”, SIGGRAPH ’86.

クリックしてrend_eq.pdfにアクセス

[Jensen 2002] Henrik Wann Jensen, 苗村健, “フォトンマッピング ―実写に迫るコンピュータグラフィックス”, オーム社, pp.135-138, 2002.

[Dutréら 2006] Philip Dutré, Kavita Bala, Philippe Bekaert, “Advanced Global Illumination”, A K Peters, 2006.

[Nicodemusら 1977] F. E. Nicodemus, J. C. Richmond, J. J. Hsia, I. W. Ginsber, and T. Limperis, “Geometrical Considerations and Nomenclature for Reflectance”, NBS Monograph 160, U. S. Dept. of Commerce, 1977

クリックしてnicodemus-brdf-nist.pdfにアクセス

色彩工学

[内村 2016] 内村創, “ゲームのための色彩工学”, CEDEC 2016.
http://cedil.cesa.or.jp/cedil_sessions/view/1449

[太田 1993] 太田登, “色彩工学”, 東京電機大学出版, 1993.

[張 2012] 張小忙, “デジタル色彩工学”, 共立出版, 2012.

照明工学

[照明学会 2012] 照明学会, “照明工学”, オーム社, 2012

・IES仕様書

クリックしてIES.pdfにアクセス

[Lagarde 2014] Sébastien Lagarde, “IES light format: Specification and reader”,
IES light format: Specification and reader

[Karlen and Benya 2004] Mark Karlen, James R. Benya, “Lighting Design Basics”, John Wiley & Sons, 2004.

クリックしてlighting_design_basics.pdfにアクセス

[岩崎電気 2016] 岩崎電気株式会社, “照明技術資料”, http://www.iwasaki.co.jp/info_lib/tech-data/

幾何光学

[牛山, 草川 2003] 牛山善太, 草川徹, “シミュレーション光学 ― 多様な光学系設計のために”, 東海大学出版, 2003

[川田 2014] 川田善正, “はじめての光学”, 講談社, 2014

[Hecht 2002] Eugene Hecht, 尾崎義治,朝倉利光, “ヘクト光学Ⅰ ― 基礎と幾何光学”, 丸善出版, 2002

Physically Based Rendering

[Burley 2012] Brent Burley, “Physically Based Shading at Disney”, SIGGRAPH 2012 Course: Practical Physically Based Shading in Film and Game Production

クリックしてs2012_pbs_disney_brdf_notes_v3.pdfにアクセス

[Karis 2013] Brian Karis, “Real Shading in Unreal Engine 4”, SIGGRAPH 2013 Course: Physically Based Shading in Theory and Practice

クリックしてs2013_pbs_epic_notes_v2.pdfにアクセス

[Nueblt, Pattineo 2013] David Neubelt & Matt Pettineo, “Crafting a Next-Gen Material Pipeline for The Order: 1886”, SIGGRAPH 2013 Course: Physically Based Shading in Theory and Practice

クリックしてs2013_pbs_rad_notes.pdfにアクセス

[Lagarde, Rousiers 2014] Sébastien Lagarde, Charles de Rousiers, “Moving Frostbite to Physically Based Rendering 3.0”, SIGGRAPH 2014 Course: Physically Based Shading in Theory and Practice.
Siggraph 2014 : Moving Frostbite to Physically based rendering V3

[安田ら 2014] 安田廉, 田村尚希, 川瀬正樹, “シリコンスタジオの最新テクノロジーデモ技術解説”, CEDEC 2014.
http://www.siliconstudio.co.jp/rd/presentations/

[Largrde 2016] Sébastien Lagarde, “An Artist-Friendly Workflow for Panoramic HDRI”, SIGGRAPH 2016 Course: Physically Based Shading in Theory and Practice.

クリックしてs2016_pbs_unity_hdri_notes.pdfにアクセス

[Heiz 2014] Eric Heitz, “Understanding the masking-shadowing function in microfacet-based brdfs”, Journal of Computer Graphics Techniques, 3(2):32–91, 2014.

——————————————————————-

レンダリング方程式の導出方法

結論として,完全に理解できなかった(特に数式変形が…)。勉強成果としてメモだけを残しておく。大いに間違っている可能性あり。

レンダリング方程式というかボリュームレンダリング方程式の導出方法が[Kajiya and Von Herren 1984]に載っている,また日本語で見たい場合には[Jensen 2002]を見ると良い。
基本的な導出は[Chandrasekhar 1960]と同じ手順でやればよいが,この本では放射強度で導出しているので,レンダリング方程式を導出する際は放射輝度を用いて計算を進めればよさそう。
まずは,pencil of radiationを考え,放射照度や放射束などを順次定義していく,次に媒質中を進むことを考えて,散乱現象を立式化する。散乱では,吸収と放出が発生するとし,どのぐらい吸収するか放出するかを示す吸収係数と放出係数を導入する。散乱するかどうかは媒質中の物質と当たるかどうかに依存するから,密度が高ければ当たる可能性が高いし,密度が低ければ当たる可能性は低くなるから,(密度)×(係数)で実際の値を求められるので,吸収はマイナス値,放出はプラス値として計算できる。散乱するということは物質なり粒子なりと衝突することと考えると,ボールを壁に投げて跳ね返るように,散乱現象によって方向が変わる可能性がある。どの方向にいくかを位相関数とし導入し,全方向についての積分をとることで値が求めることができる。ここまで,散乱について考えてる。黒体放射のような物質そのものによる光の放出は考えていなかったので,最後に自己照明要素を足して,ボリュームレンダリング方程式が導出できる。

放射量か測光量か?

[Lagarde, Rousiers 2014]でも取り上げられているように,どちらを選ぶか迷いどころ。照明器具などは測光量で取り扱われているものがおおいので,Frostbiteに習って測光量にするのが今時なのかもしれない。
あのエンジンもそうだし,ドラゴンエンジンとかもそうなっていそうな話をちらりと聞いたり。IESプロファイル使っているところは大体そうなのかな?
ちなみに放射量と測光量の違いは被視感度を物理量に掛けているかどうか。このあたりの話は[内村 2016]を見るのが一番良い。

BRDF

BRDFの元手は[Nicodemusら 1977]の文献。この文献を見ると分かるが超絶詳しく説明されている感がある。
これから実装するのであれば,次をサポートしておくのが良いのかもしれないです。

  • Renormalize Disney Diffuse
  • Cook-Torrance

Disney Diffuse

Disney Diffuseは[Burley 2012]で発表されたモデルで数式で表すと次のようになります。

\begin{eqnarray}
f_d = \frac{\rm baseColor}{\pi} \left( 1 + ( F_{D90} -1 ) ( 1 – \cos \theta_l )^5 \right) \left( 1 + ( F_{D90} – 1 )( 1 – \cos \theta_v )^5 \right)
\end{eqnarray}

ここで,\(F_{D90} = 0.5 + 2 (\cos \theta_d) ^2 \, m\)とします。\(\rm baseColor\)は基本色,\(\theta_l\)は,法線とライトベクトルのなす角,\(\theta_v\)は法線と視線ベクトルのなす角,\(\theta_d\)はライトベクトルとハーフベクトルのなす角で,\(m\)は面の粗さを表現するパラメータです。

Renormalized Disney Diffuse

オリジナルのDisney Diffuseは下図のように,最大で1.5倍程度に値が増幅される恐れがあり,エネルギー保存が守られないという問題があります。

※図は,Sébastien Lagarde, Charles de Rousiers,
“Moving Frostbite to Physically Based Rendering”,
SIGGRAPH 2014 Course: Physically Based Shading in Theory and Practice. より引用
そこで,[Lagarde, Rousiers 2014]では1を下回るように調整を加えました。この調整は完全に1になるものではないですが,十分に1に近い値とのことです。この調整を加えた計算処理は次のようになります。

float Fr_DisneyDiffuse
(
    float NdotV,
    float NdotL,
    float LdotH,
    float linearRoughness
)
{
    float energyBias   = lerp(0, 0.5, linearRoughness);
    float energyFactor = lerp(1.0, 1.0 / 1.51, linearRoughness);
    float fd90         = energyBias + 2.0 * (LdotH * LdotH) * linearRoughness;
    float3 f0          = float3(1.0f, 1.0f, 1.0);
    float lightScatter = F_Schlick(f0, fd90, NdotL).r;
    float viewScatter  = F_Schlick(f0, fd90, NdotV).r;
 
    return lightScatter * viewScatter * energyFactor;
}

 

Cook-Torrance

Cook-TorranceはPhongよりもより精密なモデルとされています。Cook-Torranceは金属の反射モデルに適しているとされています。Cook-Torranceモデルは次のように表されます。

\begin{eqnarray}
f_s = \frac{F \, G \, D}{4 \cos \theta_v \cos \theta_l}
\end{eqnarray}

ここで,\(F\)はフレネル項,\(G\)は幾何減衰項,\(D\)はマイクロファセット分布関数とします。

一昔前のモデル

一昔前までは,\(F\)はSchlickによる近似,\(G\)はTorrance・Sparrowによるモデル,\(D\)にはBeckmann分布を使用しました。これらを数式で表すと次のようになります。

\begin{eqnarray}
F_{\rm Schlick} &=& F_0 + (1 – F_0)(1 – \cos \theta_v)^5 \\
G_{\rm TS} &=& {\rm min} \left( 1, \frac{2 \cos \theta_l \cos \theta_v}{\cos \theta_d}, \frac{2 \cos \theta_h \cos \theta_l}{\cos \theta_d} \right) \\
D_{\rm Beckmann} &=& \frac{1}{4 m^2 \cos ^ 4 \theta_h} e^{- \frac{1}{m^2} \left( \frac{1 – \cos^2 \theta_h}{\cos^2 \theta_h}\right)}
\end{eqnarray}

Karisのモデル

[Karis 2013]では,\(F\)に球面ガウシアンによる近似,\(G\)はSchlickモデル,\(D\)にはTrowbridge-Reitzモデルを使用します。これらを数式で表すと次のようになります。

\begin{eqnarray}
F_{\rm Karis} &=& F_0 + (1 – F_0)2 ^{(-5.55473 \cos \theta_d – 6.98316) \cos \theta_d} \\
D_{\rm Schlick} &=& \frac{\alpha ^2}{\pi \left( \cos^2 \theta_h (\alpha^2 -1 ) + 1 \right)^2} \\
D_{GGX} &=& G_1(\theta_l) G_1(\theta_v)
\end{eqnarray}

ここで,
\begin{eqnarray}
\alpha &=& m^2 \\
G_1(\theta) &=& \frac{\cos \theta }{\cos \theta(1 – k) + k} \\
k &=& \frac{(m + 1)^2}{8}
\end{eqnarray}
とします。

Lagardeらのモデル

[Lagarde, Rousiers 2014]では,\(F\)にSchlickによる近似,\(G\)はHeight-Correlated Smith,\(D\)にはGGXを用います。Height-Correlated Smith関数は次のようになります。

\begin{eqnarray}
G = \frac{{\chi}^{+}({\bf v} \cdot {\bf h}){\chi x}^{+}({\bf l} \cdot {\bf h}) }{1 + \Lambda(\bf v) + \Lambda(\bf l) }
\end{eqnarray}

ここで,\(\chi^+(a)\)はヘビサイド関数で\(a>0\)の場合に\(1\)で,\(a \leq 0\)の場合に\(0\)となります。また,

\begin{eqnarray}
\Lambda(\bf m) = \frac{-1 + \sqrt{1 + \alpha^2 \tan^2(\theta_m)}}{2} = \frac{-1 + \sqrt{1 + \frac{\alpha^2(1-\cos^2(\theta_m))}{\cos^2{\theta_m}}}}{2}
\end{eqnarray}

となります。この式自体の導出は,[Heiz 2014]のAppendix B.に詳細な記載があります。
この関数は[Lagarde, Rousiers 2014]で,次のような実装コードが示されています。

float V_SmithGGXCorrelated ( float NdotL, float NdotV, float alphaG )
{
    // Original formulation of G_SmithGGX Correlated
    // lambda_v = ( -1 + sqrt( alphaG2 * (1 - NdotL2 ) / NdotL2 + 1)) * 0.5f;
    // lambda_l = ( -1 + sqrt( alphaG2 * (1 - NdotV2 ) / NdotV2 + 1)) * 0.5f;
    // G_SmithGGXCorrelated = 1 / (1 + lambda_v + lambda_l );
    // V_SmithGGXCorrelated = G_SmithGGXCorrelated / (4.0f * NdotL * NdotV

    // This is the optimize version
    float alphaG2 = alphaG * alphaG ;
    // Caution : the " NdotL *" and " NdotV *" are explicitely inversed , this is not a mistake .
    float Lambda_GGXV = NdotL * sqrt(( - NdotV * alphaG2 + NdotV ) * NdotV + alphaG2 );
    float Lambda_GGXL = NdotV * sqrt(( - NdotL * alphaG2 + NdotL ) * NdotL + alphaG2 );

    return 0.5f / ( Lambda_GGXV + Lambda_GGXL )
}

 

BRDF正規化試験

[Heiz 2014]にBRDFの正規化をチェックするWhite Furnace試験と呼ばれる方法が記載されています。

White Furnace試験

BSDF = BRDF + BTDF なので,
\begin{eqnarray}
s(\omega_o, \omega_i) = \rho(\omega_o, \omega_i) + t(\omega_o, \omega_i)
\end{eqnarray}
ここで,\(\omega_o\)は出射方向, \(\omega_i\)は入射方向とし,\(s\)は双方向散乱分布関数(bidirectional scattering distribution function)で,\(\rho\)は双方向反射率分布関数(bidirectional reflecance distribution function)で,\(t\)は双方向透過率分布関数(bidirectional transmittance distribution function)とします。
サーフェイスが放射輝度を吸収しないとすると,散乱の際に光線の放射輝度は完全に保たれます。したがって,マイクロファセットベースの散乱モデルによる検証すべき重要な性質は,サーフェイスの吸収がゼロであるときに,散乱された光線の分布が完全に正規化されることです。すなわち,

\begin{eqnarray}
\int_{\Omega} s(\omega_o, \omega_i) | \omega_g \cdot \omega_i | d\omega_i = 1 \,\, \forall \omega_o
\end{eqnarray}
ここで,\(\omega_o\)は出射方向, \(\omega_i\)は入射方向,\(\omega_g\)は幾何法線で\(\omega_g = (0, 0, 1)\)とします。

フレネル項が常に1の場合には,光線は透過しません(サーフェイスに入り込まない)。そのため,BTDFの評価は\(t = 0\)で,このとき散乱モデルはBRDFによって完全に定義されます(要するに \(s = \rho\))。この場合において,光線はエネルギー損失無しで全て反射し,分布が正規化されます。これはWhite Furnace試験方程式によってモデル化されます。

\begin{eqnarray}
\int_{\Omega} \rho (\omega_o, \omega_i) | \omega_g \cdot \omega_i | d\omega_i = 1
\end{eqnarray}

直観的には,出射方向からのレイキャストが1度あるいは多数回散乱し,偶然サーフェイスから出ることを表します。ですが,一般的な解析的BRDFはマイクロサーフェイス上で複数回散乱するモデルではありません。シャドウイング関数によってBRDFから複数回のバウンスする光線は取り除かれます。これはなぜかというと,BRDFモデルは”完全反射体”であるマイクロサーフェイス上でパラメータ化するさえでさえ,積分して1になることはないため,White Furnace試験方程式を満たしません。

Weak White Furnace試験

最初の散乱と一緒になる一般的なBRDFにはWhite Furnace試験は使用できません。一般的なマイクロファセットベースのBRDFによって満たされなければならない,別の試験方法についての記載が[Heiz 2014]にあります。これはWeak White Furnace試験方程式と呼ばれ,次式で与えられます。

\begin{eqnarray}
\int_{\Omega} \frac{G_1(\omega_o, \omega_h)D(\omega_h)}{4|\omega_g \cdot \omega_o |} d\omega_i = 1
\end{eqnarray}

ここで,\(G_1(\omega_o, \omega_h)\)はハーフベクトルの統計上のマスキング関数であり,範囲は[0, 1]になります。この式の定義は[Heiz 2014]の式(12)に掲載されています。難しそうなので,あとで時間をみてどっかでちゃんとまとめておきたいなぁ…。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください