物理ベースレンダリング入門 その② - 鏡面反射BRDF・拡散反射BRDF

物理ベースレンダリングに入門するための連載の第2回です。
今回は主要な鏡面反射BRDFと拡散反射BRDFを紹介します。

はじめに

この連載では物理ベースレンダリングに関する基礎的な知識をまとめていきます。
第1回では物理ベースレンダリングの概念とその背後にある考え方についてまとめました。

light11.hatenadiary.com

本記事は上の記事の知識を前提としますので、必要に応じて参照してください。

第2回では物理ベースのシェーダを実装する上で必要なBRDFについて紹介します。
入門編ということもあり表面化散乱や透過、特殊な材質については触れませんのでご了承ください。

本記事で使う記号の定義

本記事において式中の各記号は以下の定義で取り扱います。
各式を見る際に照らし合わせながら見てください。

記号 説明
 v 視線方向を表す単位ベクトル
 l 入射光の方向を表す単位ベクトル
 n 法線方向を表す単位ベクトル
 h ハーフベクトル
 f BRDF
 f_{d} BRDFの拡散反射成分
 f_{r} BRDFの鏡面反射成分
 \alpha perceptualRoughness(ユーザによる入力値)を二乗したラフネス
 \sigma 拡散反射率(ディフューズアルベド
 f_{0} 法線方向から入射する光の反射率
 f_{90} グレージング角から入射する光の反射率

BRDFとは?

本記事で紹介するBRDFとは、ざっくり言ってしまうと「入ってきた光のうちどれだけを反射するか」を示した式です。
これを実装できれば物理ベースのシェーディングはできたようなものなので本記事ではこれを中心に取り扱います。
ちなみにBRDFはBidirectional Reflectance Distribution Functionの略であり、双方向反射率分布関数とも呼ばれます。

さてBRDFは鏡面反射と拡散反射のそれぞれについて求める必要があります。
この鏡面反射BRDFと拡散反射BRDFについてはいくつものモデルが考案されているため、
以下ではそのうちの主要なものをいくつか紹介していきます。

鏡面反射BRDF

鏡面反射BRDFを実装するための式としてはCook-Torranceのモデルがよく使われます。

 {\displaystyle
f_{r}(v,l)=\frac{D(h,\alpha )G(v,l, \alpha)F(v,h,f_{0})}{4(n\cdot v)(n\cdot l)} \tag{1}
}

上式においてD項は法線分布関数と呼ばれるもので、ハーフベクトル方向を向いているマイクロファセットの多さを表す確率分布関数です。
これによりハイライトの大きさや形が決まります。

G項は幾何減衰を表しており、つまりマイクロファセットによる光の遮蔽がどれだけ起こるかを示します。
F項はフレネル反射に影響を表しています。

要するに、この式を解けばマイクロファセットやフレネル反射の影響を考慮した反射率が求められるということになります。

各項の具体的な計算方法については様々な研究結果とモデルがあるので、その中からいずれかを選択することになります。
これらのモデルの詳細については次節以降で説明します。

なお上記の式の簡単な導出(や定数4の意味)については2017年のGDCの講演*1で分かりやすく説明されています。

法線分布関数(D項)

法線分布関数については他の二つの項に比べて多くのモデルが考案されており、
よく使われるものとしてはBeckmann、Phong、GGXといったモデルがあります。
本記事ではこのうちよく使われるGGXというモデルを紹介します。

GGXはTrowbrdige-Retizとも呼ばれる法線分布関数のモデルです。
式としては以下のように表されます。

 {\displaystyle
D_{GGX}(h,\alpha) = \frac{\alpha ^{2}}{\pi ( (n \cdot h)^{2}(\alpha ^{2}-1)+1)^{2}} \tag{2}
}

長いテールを持つことを特徴としていて、この特徴が現実の物質に近しいとされています。

幾何減衰項(G項)

次に幾何減衰項についてまとめます。
幾何減衰はマイクロファセットにより光が遮蔽される現象を表した項です。

このG項を考える上では、変数の定義などをNDFのものに合わせなければうまくいきません。
すなわちGGXに対応したG項があるわけですが、これにもいくつかのモデルが存在します。

本記事では、Smith関数のSchlick近似とHeight-Correlated Smith関数と呼ばれる2つを紹介します。

Smith関数のSchlick近似

SmithモデルのSchlick近似については、GGXに合わせたものをKaris氏がSIGGRAPHで発表した資料*2を参考にします。
ちなみに上記の資料はUnreal Engine 4におけるシェーディングの実装をまとめたものになります。

さて遮蔽には「入射した光」が遮蔽される現象と「表面で反射した光」が遮蔽される現象の二つがあります。
そのためG項を l vを変数とする二つの関数に分解します。

 {\displaystyle
G(v,l,\alpha )=G_{1}(l,\alpha )G_{1}(v,\alpha ) \tag{3}
}

この G_{1}については以下の式で表されます。

 {\displaystyle
G_{1}(v)=\frac{n \cdot v}{(n \cdot v)(1-k)+k} \tag{4}
}

 {\displaystyle
k=\frac{(Roughness+1)^{2}}{8} \tag{5}
}

Height-Correlated Smith関数

Height-Correlated Smith関数はHeitz氏の論文*3に掲載されているモデルで、
Smithの幾何減衰関数をGGX向けに変形し、さらにマイクロファセットの高さを考慮したものです。

このモデルではまず V(v,l,\alpha)を以下のように定義します。

 {\displaystyle
V(v,l,\alpha)=\frac{G(v,l,\alpha)}{4(n \cdot v)(n \cdot l)} \tag{6}
}

これにより、Cook-TorranceのBRDFの式(1)は以下のように変形できます。

 {\displaystyle
f_{r}(v,l)=D(h,\alpha )V(v,l,\alpha)F(v,h,f_{0}) \tag{7}
}

その上で、 V(v,l,\alpha)を以下のように計算します。

 {\displaystyle
V(v,l,\alpha)= \frac{0.5}{\Lambda _{l}+\Lambda_{v}} \tag{8}
}

 { \displaystyle
\Lambda _{l}=n \cdot v \sqrt{(n \cdot l)^{2}(1.0-\alpha ^{2})+\alpha ^{2}} \tag{9}
}

導出についてはFilamentのドキュメント*4が非常にわかりやすいので参考にしてください。

フレネル項(F項)

フレネル項は視線のベクトルと法線との角度に応じて反射率が変わる現象(フレネル反射)を表しています。
ちゃんと計算すると複雑な式になるのですが、Schlickによる近似式があるのでこれを使います。

 {\displaystyle
F_{Schlick}(v,h,f_{0},f_{90})=f_{0}+(f_{90}-f_{0})(1-v \cdot h)^{5} \tag{10}
}

上記では F_{90}を変数として扱っていますが、 F_{90}の部分を1と表記する場合もあります。

拡散反射BRDF

次に拡散反射モデルについて考えます。

拡散反射には古典モデルをベースにエネルギー保存だけ考慮したLambertian diffuse BRDFの他、
Burley氏が提唱したDisney Diffuse BRDF*5やOren-Nayerモデル*6が存在します。

拡散反射は鏡面反射に比べて見た目にそれほど影響を及ぼさないことから、
シンプルなLambertian diffuse BRDFや、比較的軽いDisney Diffuse BRDFが用いられることが多いです。

Lambertian diffuse BRDF

Lambertian diffuse BRDFは古典的なランバート反射についてエネルギー保存を考慮したものです。
考え方としては物体表面を覆う半球上に均等に光が拡散反射するというもので、式としては下記の通りとなります。

 {\displaystyle
f_{d}(v,l)=\frac{\sigma}{\pi} \tag{11}
}

 \sigmaは拡散反射率であり、いわゆるディフューズアルベドです。
これを三次元の値で定義することにより物体の色が決まります。

Disney Diffuse BRDF

上記のLambertian diffuse BRDFは見ての通り非常に軽いですが、
ラフネスやフレネルなどの影響を何も考えていません。

これらを考慮したい場合Disney Diffuse BRDFが使われます。

 {\displaystyle
f_{d}(v,l)=\frac{\sigma}{\pi}F_{Schlick}(n,l,1,f_{90})F_{Schlick}(n,v,1,f_{90}) \tag{12}
}

 {\displaystyle
f_{90}=0.5+2 \alpha cos^{2}(\theta_{d}) \tag{13}
}

上式を見るとラフネスやフレネル反射が考慮されていることがわかります。

ただしDisneyモデルはエネルギー保存の法則を厳密に守っているものではないことに注意してください。
(物理的な正しさよりもアーティストにとっての使いやすさを重視したモデルになっています)

まとめ

以上、本記事では鏡面反射BRDFと拡散反射BRDFの式を紹介しました。
これらの式をシェーダに落とし込むことで物理ベースのシェーディングを実装できます。

次回は今回の式を使って、Unityで実際に物理ベースのシェーダを書いてみます。

連載一覧

light11.hatenadiary.com

light11.hatenadiary.com

参考

qiita.com

https://google.github.io/filament/Filament.md.html

BRDFモデルの変遷

*1:Earl Hammon, Jr. 2017. PBR Diffuse Lighting for GGX+Smith Microsurfaces. GDC 2017.

*2:Brian Karis. 2013. Real Shading in Unreal Engine 4. SIGGRAPH 2013.

*3:Eric Heitz. 2014. Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs. Journal of Computer Graphics Techniques

*4:Romain Guy and Mathias Agopian. 2018. Physically Based Rendering in Filament . https://google.github.io/filament/Filament.md.html#materialsystem/specularbrdf/geometricshadowing(specularg)

*5:Brent Burley. 2012. Physically Based Shading at Disney. ACM SIGGRAPH 2012.

*6:Michael Oren and Shree K. Nayar. 1994. Generalization of lambert's reflectance model. SIGGRAPH, 239–246. ACM.