PS4 "Killzone : Shadow Fall" の物理ベースなライティングの説明
概要
- 前回の記事で紹介した PS4 Killzone Shadow Fall の技術資料について - OLD hanecci’s blog : 旧 はねっちブログ については以下のような 3 部構成になっています.
"Killzone : Shadow Fall" の物理ベースなライティングの注意点
- 後述するように Cook Torrance BRDF を使っているので, 主にスペキュラライティングに焦点を当てています.
Killzone : Shadow Fall で物理ベースなライティングを採用した理由の列挙
ディフューズ反射とスペキュラ反射について
- ゲームでは物体の表面に光が当たったときの反射の挙動を, 一様に反射して視点による指向性を持たないディフューズ反射(青い線)と, 指向性を持っていて視点によって見た目が依存するスペキュラ反射(黄色い線)として近似して利用しています.
- ここで近似と言っているのは実際の物体表面の光の反射はより複雑で, 正確に表現するには物体表面による光の反射をより一般的に表現したものである BRDF というもので表す必要があるからです.
- しかしゲームでは GPU の計算コストを減らす都合上, 一般的である BRDF を使わずに ディフューズ反射とスペキュラ反射の組み合わせを代わりに使います.
- 非金属の場合は下図のようにディフューズ反射(青い線)と, スペキュラ反射(黄色の線)の両方が起きます.
- 金属の場合は下図のように, ほぼスペキュラ反射(黄色の線)が支配的です.
マイクロファセットに基づく 物理ベースなスペキュラライティング
- マイクロファセット理論に基づいた, 物理ベースなスペキュラライティングで重要なのは以下の 3 つの要素(F, D, G)です.
- F(l,h) : フレネルによってライトベクトルとハーフベクトルがなす角度に応じて, スペキュラの反射率が変化します.
- D(h) : ラフネス(表面の粗さ)によって, マイクロファセットが反射するスペキュラの拡散具合(ボケ具合)を変わります.
- (以前に書いたマイクロファセットの分布関数の記事: http://d.hatena.ne.jp/hanecci/20130511/p1 )
- 幾何減衰率 G(l, v, h ): マイクロファセット自身によって遮蔽されるライティングの量を求めます.
少ないマテリアルのパラメータで, フォトリアリスティックな見た目を表現
- Killzone では下の 3 種類のパラメータを使っています.
- ディフューズアルベド (RGB8)
- ラフネス (R8)
- スペキュラリフレクタンス (RGB8)
- Killzone では Cook Torrance BRDF を使っているので, ディフューズライティングに使っているのはディフューズアルベドだけで, ラフネスやスペキュラリフレクタンスとは連動していないと思います.
- またスペキュラライティングに使っているのは, ラフネスとスペキュラリフレクタンスだと思っています.
- この情報の元のスライドは下のものです.
- 下図がラフネスを変化させたときのスペキュラライティングの見た目の変化で, ラフネスが粗い(0.0)ときはボケたスペキュラになり, ラフネスが滑らか(1.0)のときはくっきりとしたスペキュラになります.
- 下図が非金属のマテリアルの「スペキュラリフレクタンス」と「ラフネス」を変化させたときの見た目の変化です.
- 下図が「ラフネス」を変化させたときの各金属マテリアルの見た目の変化で, ラフネスが粗いとざらざらとした見た目になり, ラフネスが滑らかだとつるつるした見た目になります.
マテリアルのパラメータのうち, 物理的なパラメータがあるものはそれを利用
- マテリアルのパラメータのうち, 実世界で測定されたデータの値が使えるものについてはその値を使っています.
- 今回の例だと, ディフューズアルベドとスペキュラリフレクタンスと思います.
- デザイナーさんはこれらの値をベースにして, テクスチャを書くらしいです.
- (ディフューズアルベドについては写真撮影などで推定できますし,) 身近な物質のスペキュラリフレクタンスは以下のような値です.
-
- 非金属(水やプラスティックなど)のスペキュラリフレクタンスの測定結果
-
- 金属系のスペキュラリフレクタンスの測定結果
- この情報の元のスライドは下のものです.
スペキュラライティングのエネルギー保存
- ラフネスを変化させて, スペキュラライティングのハイライトの領域の大きさが変わった際にそれに連動してハイライトの明るさも変化するようにしていました.
- 下図では左から右に行くに従って, ラフネスが粗い -> 滑らかと変化した際にハイライトの領域が小さくなっていきます.
- その際に上段のスペキュラのエネルギー保存なしではハイライトの明るさがほとんど変化しませんが, 下段のエネルギー保存ありではきちんとハイライトが明るくなっています.
- スペキュラライティングのエネルギー保存ができているのは, スペキュラライティングの計算時にきちんと正規化しているからだと思います.
- 以前に書いた記事 : http://d.hatena.ne.jp/hanecci/20130511/p1
スペキュラライティングの計算方法
- 上の数式に使われている記号の意味については下図のようになります.
- Cook Torrance BRDF でのディフューズライティングの計算は k_d * R_d となっていて, とてもシンプルです.
- スペキュラライティングについてはラフネスによって変化するマイクロファセットや, フレネルときちんと連動しています.
- マイクロファセットの幾何減衰には Smith Schlick Visiblity Function(下図参照)を使っているようです.
- またスペキュラリフレクタンスに基づく正規化をしているらしいのですが, 正直, ちょっと意味がわからないです.
- ラフネスに応じて、スペキュラの重点サンプルのコーンの角度が変化については, 別の記事で説明します. ( PS4 "Killzone : Shadow Fall" の物理ベースなエリアライティングの説明 http://d.hatena.ne.jp/hanecci/20130520 )
- 元の情報は下のスライドです.
IBL を使ったライティング方法 (ここの解説はちょっと自信ないです)
- 従来の IBL を使ったライティングでは IBL を使ったライティングの計算をする際にラフネスのパラメータだけを見て, その値を元にリフレクションベクトルで参照した IBL をぼかしたりします.
- 下図は恐らく, その際に利用するラフネスの値を可視化したものです.
- 上の方法だと, フレネルやスペキュラリフレクタンスを考慮しておらず, また正しくラフネスを扱えているかが怪しいです.
- そこでここでは Ambient BRDF という手法を使っています.
- Ambient BRDF では 視点と法線の角度, ラフネス, スペキュラリフレクタンスの 3 つが与えられた際に, 下図のようにその点の BRDF の平均値を(ライトを無視した)半球積分によって事前に Mathematica で計算しておいて 3D texture に保存しておきます.
- そして, ランタイム時には "視点と法線の角度, ラフネス, スペキュラリフレクタンス" の 3 つのパラメータを元に, この 3d texture を参照して, (Ambient) BRDF として利用します.
- 下図が Ambient BRDF を可視化したものです.
- 下図が従来の ポイントベースの IBL を使ったレンダリング結果で, 全体的にライティング結果が一様に白くなって引き締まりがない結果になっています.
参考文献
- "Physically Based Shading Models in Film and Game Production: Practical Implementation at tri-Ace". SIGGRAPH 2010.