1.4K Views
August 16, 19
スライド概要
リアルタイムに再構築可能なGIを実現するためにヘキサドライブがどのような取り組みを行ったかを紹介しています。
求められた品質について
・60fpsに耐えられる処理速度
・芝や土の照り返しを得られるだけの粒度でのプローブ配置
検証した手法紹介
・ライトプローブの失敗事例
・ライトプローブ作成に採用した手法
・リフレクションプローブ作成に採用した手法
株式会社ヘキサドライブの資料共有用アカウントです。 公式ブログ:https://hexadrive.jp/hexablog/ note :https://note.com/hexadrive
PS4「プロ野球スピリッツ2019」 リアルタイムGI採用事例 株式会社ヘキサドライブ 澤野 和樹
内容 リアルタイムに再構築可能なGIを実現するためにヘキサドライブがどの ような取り組みを行ったか紹介 求められた品質について 検証した手法紹介 ライトプローブの失敗事例 ライトプローブ作成に採用した手法 リフレクションプローブ作成に採用した手法
求められた品質 60FPSに耐えられる速度 インゲーム中は60FPS、デモは30FPSを保たなければいけない 芝や土の照り返しを得られるだけの粒度でプローブを配置 ライトプローブは5m置きに配置 リフレクションプローブは40m置きに配置 プローブの配置はツールが自動で行う
求められた品質 インゲーム中に時間が変動する中で破綻の無いライティング 事前に生成したプローブをブレンドしてライティングすることは アセットが変わるたびに再度ベイクしてもらう必要があるため 今回は無しとなった インゲーム中に再構築を行う必要がある 球場 * 時間 * 天候のバリエーションをカバーする必要がある
ライトプローブ
ライトプローブの失敗事例:ボリューム法 四面体でボリュームを作成し、ステンシルマスクでボリュームの中だ けライティングを行う手法 [Valient 2011] [Cupisz 2012] プローブはIBLから2次のSHに格納[Baker and Hoffman 2006]
ライトプローブの失敗事例:ボリューム法 品質の問題 ボリューム法による描画のためZ-Fightingが発生する箇所があった ボリュームの形状を四面体にしたことで鋭利な黒ずみが発生した 速度の問題 ステンシルを書き込む処理でうまくCUを使いきれず速度がでなかった ライティング計算時のプローブのブレンドコストが高く目標とする速度を出す ことができなかった 1球場当たり1万個近くのプローブを作成する必要があるためIBLでは構築時間 に問題があった
採用した手法 ライトプローブのフォーマット 2次のSHに格納 RGBA16Fの3DTexutreに格納(R, G, B) プローブ間の補間に重心座標計算を行わずにサンプラで解決できるので速度改善が見込 めた プローブ構築方法 空のIBLとVPL(Virtual Point Light)から照り返しの明るさを収集して プローブに格納 VPLはIBLよりメモリに優しく高速に構築できるため採用した
ライトプローブ構築の手順 事前に生成するもの 事前生成の手順 1.DCCツールでライトプローブの適用範囲を設定 2.C# + Physxでレイを飛ばし、球場にVPLの情報を作成 3.実機にVPLの情報を送りVPLのポイントのアルベド値を収集しパック 動的に生成するもの ライトプローブの位置や適用範囲 VPLを作成するための情報 空のIBL VPL ライトプローブ 動的生成の手順 1.空のIBLを作成 2.事前生成した情報を元にVPLを作成 3.近くのVPL同士で明るさを伝搬 4.空のIBLとVPLを収集しライトプローブを作成
事前生成 VPLを高速に作成するためにVPLの位置や伝搬などの情報を格納したサ ンプルポイントを事前に作成 サンプルポイントのフォーマット 型 バイト 詳細 float*3 12 配置場所XYZ座標 byte*4 4 ushort*4 8 アルベド 空の可視性+ベントノーマル方向の遮蔽係数 ushort*4 8 シェーディングSH*遮蔽SH(ライトの入射ベクトルへのライティング情報) uhosrt*8 16 バウンスサンプリングポイントID
事前生成 プローブがVPLを高速に収集するために事前にどのサンプルポイントか ら収集するかの情報を作成 プローブのフォーマット 型 バイト 詳細 float*3 12 配置場所XYZ座標 byte*4 4 空の可視性 ushort*8 16 収集するサンプルポイントのID
動的生成 サンプルポイントをライティングし、VPLを作成する サンプルポイントの「バウンスサンプリングポイントID」を元に近く のVPL同士で明るさを伝搬する プローブは作成されたVPLと空のIBLを収集して作成する 空のIBL 空の可視性 VPLによる照り返し 合成結果
ライトプローブによる間接光のみ
空の可視性のみ
ライトプローブの品質 ☺ 全てのライトプローブの動的生成にかかるGPUコストは0.26ms 一つの球場当たりおよそ1万個のライトプローブが存在する ☺ ライティングをボリューム法から3DTextureに変更したことでCUの実行効 ☺ 芝の照り返しなどしっかり表現することが可能 ☺ 空の可視性を用いることでSSAOでは表現できないオクルージョンを表現 ☹ プローブが収集するVPLは近距離のみであるため遠くの明るさは収集する 率が良くなり0.3msで完了することができた することが可能 ことができない
ライトプローブまとめ IBLを作成するコストとVPLを作成するコストでは圧倒的にVPLの方が 早かった プローブの品質は悪くなく、芝や土の色の照り返しを表現することが 可能 空の可視性でSSAOでは表現できないオクルージョンを表現
リフレクションプローブ
採用した手法 リフレクションプローブのフォーマット R11G11B10F 解像度128 キューブテクスチャ リフレクションプローブの構築方法 キューブマップのG-Bufferをライティング GGXフィルタリング[Karis 2013] 一様サンプリング[Yamaji 2001]
リフレクションプローブの構築手順 事前に生成しておくもの 事前生成の手順 1.DCCツールでリフレクションプローブの適用範囲を設定 動的に生成しておくもの リフレクションプローブの位置や適用範囲 G-Bufferキューブマップ IBL 動的生成の手順 1.G-Bufferキューブマップを作成 2.G-Bufferキューブマップをライティング 3.GGXフィルタリングでIBLを作成
G-Bufferキューブマップ 高速に作成するためにG-Bufferをキャッシュしておくシステムを構築 キャッシュするG-Bufferの内訳は以下の通り フォーマット R8G8B8A8UnormSrgb Albedo, AO R32Uint 10:NormalX 10:NormalY 4:Metalness 8:Roughness R32Uint 10:Emissive 8:Stencil 14:Padding R16Unorm Depth 一つの球場当たりおよそ30個ほどのリフレクションプローブが存在す る G-Bufferキューブマップにおよそ10MBほどメモリを消費した
一様サンプリング 当初は重点サンプリングを採用していたが高速にフィルタリングする ためにサンプル数を16サンプルまで大幅に減らしていたため高い位置 にある高輝度部分がサンプル後、低い位置に表れてしまうといったノ イズが発生した 光源などの高輝度でノイズが発生しないように一様にサンプリングを 行った
リフレクションプローブの品質 ラフネス0.0 ラフネス0.25 ラフネス0.5 ラフネス0.75 ラフネス 1.0
リフレクションプローブの品質 全てのリフレクションプローブの動的生成にかかるGPUコストは 8.0ms ☺ 複数フレームに分散して構築することで1フレーム当たりのコストが0.2msに なり処理負荷がそこまで気にならなかった 一つの球場当たりおよそ30個のリフレクションプローブが存在する 一様サンプルすることで少ないサンプル数でノイズの出ないフィルタ リングができた ☺ ☹ DCCツールで格子状にリフレクションプローブを配置していたため アーティストが自由に配置することができなかった
まとめ VPLやG-Bufferキューブマップなどメモリに余裕があればリアルタイ ムにGIを再構築することは可能 ライトプローブは3DTextureにSHを格納することで高速にライティン グ可能 今回は簡易な実装だったがLight Bleedingなど気にする必要があまり なかったため機能としては十分だった
参考文献 [Valient 2011]Deferred Rendering in Killzone 2 [Cupisz 2012]Light probe interpolation using tetrahedral tesselations [Baker and Hoffman 2006]Physically-Based Reflectance for Games [Karis 2013]Real Shading in Unreal Engine 4 [Yamaji 2001]GSS Generater: A Software to Distribute Many Points with Equal Intervals on an Unit Sphere