graphics.hatenablog.com

技術系テクニカルアーティストのあれこれ

Physics and Math of Shading (4)

前回 の続き、最終回。


Building a Physically Based Shading Model

これまでに挙げた物理ベースシェーディングの原則 principles に則って、実際にシェーディングモデルを構築する。本来ならディフューズモデルも必要だが、今回はマイクロファセットスペキュラモデルの D 項 (NDF) と G 項 (shadowing-masking) に注目する。D 項と G 項はそれぞれ独立しているから、異なるマイクロファセットモデルから選び出して混ぜることができる。


Choosing an NDF

大抵の法線分布関数 NDF は等方性 isotropic で、面法線 n を軸に視線ベクトルを回転しても結果が変わらない。こういうときの法線分布関数はマイクロファセット法線 m を用いて内積 n・m (コサイン項) の関数として記述される。また、物理的に正しくない状態で定義されている場合が多いので、適切に正規化 properly normalize する必要がある。

マイクロファセット理論においては、視線方向 (出射方向) からみたすべてのマイクロファセットの面積の合計と面の面積は一致している必要がある。このときの面積はコサイン項に比例するので、視線ベクトル v を用いて以下のように定式化できる。
f:id:hal1932:20131102024102j:plain

なお、ここでの積分は半球ではなく全球で行う。NDF は入射光と逆方向の法線に対して負の値を与えるからだ。ここで視線ベクトル v と面法線 n が一致する場合を考える。BRDF を直接計算するにはこのほうがいいし、レイトレのときに重点的サンプリングがやりやすくなる。
f:id:hal1932:20131102024229j:plain

今回紹介するモデルはすべてマイクロファセットの高さによらず同じ法線分布を持つ(前回 の Figure 26 のようにはならない)面 heightfield surfaces を想定しているため、内積 n・m が負のときは 0 を返すような NDF になる。ただし、n・m が分母に置かれる場合は、ゼロ除算を避けるために十分に小さい値 ε で置き換えるものとする。


Blinn-Phong NDF

Blinn-Phong の式を正規化すると以下のようになる。
f:id:hal1932:20131102060428j:plain

\alpha_p はラフネス係数 roughness parameter で、これが高いほどつるつるした smooth 面になって、低いとざらざらした rough 面になる。係数が階乗の値になってるとアーティストが調整しにくいから、実際の開発では\alpha_pの上界 m を使って log_{m} \alpha_p とかの調整用パラメータを使ったりする。Blinn-Phong に限らずこういうのは便利。

Blinn-Phong NDF の分布グラフはこれ。横軸に n と m の角度θ、縦軸に関数の値、\theta=0 のときに値が大きいほうが\alpha_pも大きくなってる。
f:id:hal1932:20131102072436j:plain


Beckmann NDF

正規化した Beckmann NDF は以下の通り。
f:id:hal1932:20131102072851j:plain

Blinn-Phong のときとは逆に、\alpha_bが小さいほどつるつる、大きいほどざらざらした面になる。\alpha_p = 2 \alpha_b^{-2}-2 とおいて Blinn-Phong と直接比較すると、\alpha_b<0.5 くらいの比較的つるつるな面では、Blinn-Phong とおおよそ一致して、\alpha_b<0.1 くらいになるとほぼ完璧に同じ分布になる。その一方で、Beckmann NDF の \alpha_b はマイクロファセットのスロープ slope の二乗平均平方根に一致しているため、\alpha_b を大きくすることがスロープの平均値を大きくすることになる。ざらつき roughness がマイクロファセット法線の向きのランダム性を意味していた Blinn-Pnohg とは、ざらつきの意味合いが異なる。

\alpha_b が 1 を超えて super-rough という状態になると、更に大きく異る分布になり、\theta=\frac{\pi}{2} 付近でリング状の反射が現れるような分布になる。おそらく現実世界でも、上向きの尖った繊維状のもので敷き詰められた面やビロードのような面では、このような分布になる。いずれにせよ、そういった振る舞いを観測できるという意味で、Blinn-Phong よりも高い計算コストをかけるだけの価値はある。
f:id:hal1932:20131102220301j:plain


Trowbridge-Reitz (GGX) NDF

最後に紹介するのは Trowbridge-Reitz NDF で、これを正規化したものは GGX 分布とも呼ばれている。GGX の式は以下のとおり。
f:id:hal1932:20131102220933j:plain

Trowbridge-Reitz NDF は、Beckmann と同様にパラメータ \alpha_{tr} を大きくすると表面のざらつきが大きくなり、super-rough 状態では Blinn-Phong と同様に均質な法線分布となる。
f:id:hal1932:20131102221638j:plain

分布グラフのかたちは Blinn-Phong と明らかに異なり、より小さなハイライト narrow peaks と、なだらかな減衰 long tails をみせる。
f:id:hal1932:20131103002257j:plain


ABC NDF

複数の研究によると、これらのモデルは現実世界を正しくモデル化できてるとは言い難い。現実を更によく近似するモデルとして、ABC NDF というものが発表された。
f:id:hal1932:20131103003626j:plain
f:id:hal1932:20131103003632j:plain
k_{abc}D_{uabc}(m) の正規化項で、正規化後の式は k_{abc} D_{uabc}(m) となる。正規化項の計算が煩雑なので、何か適当な関数でフィッティングするのもいいかもしれない。

式を見ての通りパラメータが 2 つになって複雑さが増しているが、そのおかげで様々な分布を表現することができ、調整次第で現実世界での実測値にうまくフィッティングできるようになった。以下のグラフは、上側が \alpha_{abc1} を変えて \alpha_{abc2} を固定したもの、下側がその逆だ。
f:id:hal1932:20131103004012j:plain

\alpha_{abc2} の調整次第では GGX と Blinn-Phong のそれぞれにフィッティングさせることもできる。なお、Blinn-Phong にフィッティングした状態で実測値 Matusik database と比較したところ、全体的に実測値よりも高い値となった。現実世界のマテリアルの反射は、ガウシアン分布を持たない傾向があるのかもしれない。


Shifted Gamma Distribution (SGD)

ABC NDF よりも更に実測値をよく近似する SGD が最近提案されている。なお式中の \Gamma(a,x)第2種不完全ガンマ関数 (階乗の式を自然数全体に対して適用できるように一般化したもののひとつ) である。
f:id:hal1932:20131103010508j:plain
f:id:hal1932:20131103010515j:plain

この NDF は RGB それぞれに異なるパラメータを持ち、SGD 用のフレネル式は通常のフレネル式と異なるカーブになるため、他の NDF と直接比較するのは難しい。この NDF はゼロに収束するのが早く、GGX のようななだらかな減衰を持たない。ABC と違い super-rough も表現できるが、SGD が提案された論文では super-rough 状態での実測値へのフィッティング結果が示されていないため、このときの有用性は判断できない。


Choosing a Shadowing-Masking Function

大抵のマイクロファセット BRDF では、分母の G(l,v,h) と分子の (n・l)(n・v) をひとつの関数にまとめてしまっている。両方とも可視性 visibility に関する項なので、このやり方は便利だ。このまとめた項を visibility term と呼ぶことにする。

いくつかの BRDF モデルでは visibility term を 1 と仮定している。コストパフォーマンスが高いが、表面のざらつき roughness に応じた各マイクロファセットの可視性を考慮することができず、光を反射しすぎてしまうため物理的に正しくない。

最も古くに提唱されたもののひとつに Cook-Torrance の式がある。
f:id:hal1932:20131103020010j:plain

これを、visibility term として簡略化したのが以下の式だ。チープな表現にはなるが、l・h はフレネル項の計算でも使うし全体での計算負荷はだいぶ下げられる。

オススメなのは Smith の式 だ。Cook-Torrance よりも物理的に正確だし、(もともとは Beckmann NDF 専用に提案されたものが)どの NDF にも適用できるように拡張されている。

Smith の式を一般化した式 generalized Smith function は映画制作でも使われるよい近似だが、ゲーム用に使うには計算コストが高いのでかわりに Kelemen の式 を使うのがいいかもしれない。kelemen の式は Cook-Torrance の式をうまく近似したものだ。


Further Reading