PS4 "Killzone : Shadow Fall" のIBL リフレクションシステムの説明
概要
- 前回の記事で紹介した PS4 Killzone Shadow Fall の技術資料について - OLD hanecci’s blog : 旧 はねっちブログ については以下のような 3 部構成になっています.
IBL リフレクションシステムの構成
- Killzone の IBL リフレクションシステムは下図のように "スクリーンスペースのグロッシーな光沢リフレクション", "ローカルな環境キューブマップの参照", "スカイボックスの参照" の 3 段階の構成になっています.
- IBL リフレクションシステムでのピクセル単位のリフレクションの計算手順
- 1. "スクリーンスペースの光沢リフレクション" : まずは半分の解像度のバッファに対してピクセルごとに, 光沢反射をスクリーンスペースのレイマーチで計算してから結果をアップサンプリングします. 光沢リフレクションの結果は勿論ラフネスに応じてぼけ具合が変化します. またこれはもしリフレクションベクトルが物陰に当たったときにはその色をリフレクションとして利用するので, スクリーンスペースのデプスバッファを使ったスペキュラオクルージョンとして作用します.
- 2. "ローカルな環境キューブマップの参照" : 1. のスクリーンスペースのレイマーチの際に画面内のデプスバッファにレイがぶつからずにレイマーチに失敗したピクセルについては, 特定の区域ごとに置かれた"ローカルな環境キューブマップ"を参照します.
- 3. "スカイボックスの参照" : もし特定の区域ごとに置かれた"ローカルな環境キューブマップ"の範囲外であるときには, スカイボックスを参照します.
スクリーンスペースの光沢リフレクション
- 下図は "ローカルな環境キューブマップの参照", "スカイボックスの参照" だけを使って, リフレクションを計算した例です.
- この図では "ローカルな環境キューブマップの参照"が主にリフレクションで使われており, 下図の赤い点線で囲われた領域については画面中央のゲートが明らかに映りこんでなかったり, 実際の床面と違う絵が映りこんでいるので不自然です.
- 下図がこれにスクリーンスペースの光沢リフレクションを追加した結果です. 中央のゲート部分などが映り込むようになってより自然なリフレクションになりました.
- 下図は別のシーンで, "ローカルな環境キューブマップの参照", "スカイボックスの参照" だけを使って, リフレクションを計算した例です.
- この図では, 左の箱の下部の設置感のなさが気になります.
- 下図がこれにスクリーンスペースの光沢リフレクションを追加した結果です. 箱の下部については恐らく, スクリーンスペースの計算によって(環境キューブマップではなく)箱の影の部分をリフレクションとして参照するようになったので設置感が出るようになりました.
- これがスクリーンスペースのデプスバッファを使ったスペキュラオクルージョンとしての効果です.
- またわかりづらいですが右側の床面にうっすらと天井部分の青白いリフレクションが載るようになりました.
- 最後に下図はヘリコプターが出てくるシーンで, "ローカルなキューブマップの参照", "スカイボックスの参照" だけを使って, リフレクションを計算した例です.
- 赤い線で囲われた部分に影が落ちていないので不自然な感じがします.
- 下図はこれにスクリーンスペースのグロッシーなリフレクションを追加した結果です.スクリーンスペースの計算によって(環境キューブマップではなく)ヘリコプターの影部分をリフレクションとして参照するようになったのでセルフシャドウのようになっています.
ローカルな環境キューブマップ
- Killzone ではよく他のゲームでもあるように(ユーザが指定した)領域のボックスごとに環境キューブマップを作っていて, 下図のようにそのボックス内にあるポリゴンについてはその環境キューブマップを参照しています.
- 領域のボックスについては今はワールド座標系の AABB と言っていました.
- 下の 2 つの図はプローブにローカルな環境キューブマップによるリフレクションを適用したり, あるいは一番右の白いプローブについては(環境キューブマップから作ったディフューズ用の)イラディアンスマップを適用した結果です.
- 下図はオープンソースの AMD CubeMapGen(http://developer.amd.com/resources/archive/archived-tools/gpu-tools-archive/cubemapgen/)の UI が出ており, これを Killzone のグラフィックスのシステムに組み込んでいると言っていました.
- 下図は環境キューブマップに対して Cook Torrance BRDF でフィルタ処理を行ったものです.
IBL リフレクションシステムの絵の合成の流れ
- 下図は (a) 焼きこんだディフューズのライトマップ と (b) 動的なエリアライトによるライティング だけの結果です.
- リフレクション成分がないので, 絵的に寂しいです.
- 下図は (c) ローカルな環境キューブマップを参照 したときの成分です.
- そして, 上の図に乗算するための (c) Ambient BRDF (http://d.hatena.ne.jp/hanecci/20130518) の成分が下図のようになります.
- また (d) スクリーンスペースの光沢リフレクション をした結果の成分はこれです.
- そして, 下図は (d) スクリーンスペースの光沢リフレクション用のマスク画像で, これはスクリーンスペースの光沢リフレクションの計算に含まれるレイトレース時のサンプリング数を表しています.
- ここの解釈はちょっと自信ないので, 以下に講演者の発言を書いておきます.
- This is the coverage mask. This is the mask tells us how many samples from the ray traced actually were part of the integral that I was talking about previously. So we us this mask to blend over the realtime reflection in the previous buffer.
- そして, 下図が全ての結果の合成したものになるはずなのですが, どうやら発表資料のミスによって下図は左上に「最終合成結果」と書いてあるにも関わらず, この光沢リフレクションが入っていないことがわかりました.
- 具体的には, 下図の光沢リフレクションがないときの絵と見た目が全く一緒です.
- ということで, 残念ですが最終合成結果の図については正しい図が手に入ったら貼り付けます.
- 光沢リフレクションの結果については上の方の項目の"スクリーンスペースの光沢リフレクション"の図を参照して下さい.
AI : 経路探索 Jump Point Search アルゴリズムの JavaScript のデモ
経路探索 Jump Point Search の JavaScript のデモ
- グリッドに区切った空間の経路探索でよく使われるのは A* アルゴリズムです.
- それよりも効率的にグリッドの空間を探索する Jump Point Search アルゴリズムの JavaScript のデモがあったので, リンクを貼っておきます.
- Jump Point Search アルゴリズムの JavaScript のデモ
- 以下はこのデモの説明です.
- 下図の緑の位置がスタート地点で, 赤い位置がゴール地点を表していて, 黒い領域が障害物を表しています.
- 下図が A* で経路探索した結果で, 灰色が探索時に訪れたノードを示しています.
- 一方で下図が Jump Point Search(JPS)で経路探索した結果です. A* よりも探索時に訪れているのノードがかなり少ないです.
- 探索空間の開き方を見ていると, JPS の方は障害物の付近まで直線状に移動することを繰り返しているような感じです.
- こうなる理由や 長所・短所については技術的な詳細についてはまだきちんと調べていないので, 説明できる段階じゃないです.
- ちょっと気になっているので, 調べてみるかもしれないです.
- Joint Point Search の元の論文
- Online Graph Pruning for Pathfinding on Grid Maps. Daniel Harabor and Alban Grastien