“Fortnite’s Real-Time Lighting Techniques and Tools in GDC 2018” の日本語メモ
Fortnite’s Real-Time Lighting Techniques and Tools | GDC 2018 | Unreal Engine
- GDC2018 の Fortnite のリアルタイムライティングの技術とツールの動画の日本語メモです.
発表の概要
- メッシュディスタンスフィールド
- AO ( アンビエントオクルージョン )
- レイトレース・ディスタンスフィールド・シャドウ
- キャラ用のカプセルシャドウ
- 動的ライトのカリング
- 動的シャドウのキャッシュ
Fortnite のライティングでの挑戦的な項目
- 明るくカラフルな世界で, ライトが見た目的に重要
- マップ中のライト状況がかなり変化する
- 日中, 夜, 嵐
- マップ中の大体のものが破壊や作り直しが可能
- 従って, ライトのベイクができない.
- 動的にライトを計算する必要がある
- だけど, リアルなライティングをしたい
- キャラクターの影, AO, ボリュームメトリックライティング
- これらをコンソール上で実現したい
メッシュディスタンスフィールドとは?
- メッシュを覆う 3D テクスチャで, メッシュ表面までの最短距離が各ボクセルにかきこまれている
- 正の値の場合はメッシュの外側, 負の値の場合はメッシュの内側
- これはエディタ中で事前計算しておく
- 最大使用メモリサイズ 8MB ( 解像度128x128x128 )
メッシュディスタンスフィールドの使い方
- プロジェクト設定
- Project Settings -> Engine -> Rendering -> Lighting に Mesh Distance Field 関係がある
- 可視化
- Show -> Visualize -> Mesh Distance Fields
- マップ中の教会内で, ライトを動かしてそのソフトシャドウを見る例
- ライト側の設定項目を有効にする
- 椅子のメッシュディスタンスフィールドの解像度が足りないので, StaticMesh の Mesh Distance Resolution Scale を 1より大きくすると解像度が増える
メッシュディスタンスフィールドとレベルエディット
- ディスタンスフィールドシャドウは従来的なカスケードシャドウマップよりも 30-50% ほど軽い
- しかし, 静的にディスタンスフィールドを作る必要があるので, 動的な変化に対応できない
- なので, 4500 ユニット(45m?)より遠い場合にだけ, ディスタンスフィールドシャドウを使って そこより前はカスケードシャドウマップを使って境界で両者を混ぜている
- あるいは境目を DOF でごまかしている
ディスタンスフィールド・アンビエントオクルージョン
- AO は Lightmass や SSAO で計算する方法もあるが, ディスタンスフィールドを使って計算している
- Movable なスカイライトが必要
- AO の見た目は World Settings で変更可能
- 可視化
- Show -> Visualize -> Distance Field Ambient Occlusion
グローバルディスタンスフィールド
- メッシュ個別のディスタンスフィールドを全て見ていると, どんどん処理が重くなる
- 代わりにカメラの視点に応じて行進するグローバルディスタンスフィールドがある
- ディスタンスフィールドAO とパーティクルのコリジョンに利用している
- なので, テレポート時にグローバルディスタンスフィールドの再構築が必要なのでヒッチが起きることがある
ディスタンスフィールドの注意や検討事項
- DX11+ だけ
- 変形や頂点アニメーションを無視する
- 一様スケールのみ
- 少しの非一様は許容できる
- 小さいメッシュごとにディスタンスフィールドを持っていた方がディティールが出る
- 大きなメッシュで 1つのディスタンスフィールドを持っていると, 詳細な情報がなくなる
- 消防署のモデルの例 : 建物が複数のパーツ(メッシュ)で構成されている
- メモリ使用量を減らすために解像度の調整が必要
メッシュディスタンスフィールドの最適化
- コンソールコマンド r.AOListMeshDistanceFields でメモリ使用量が出力される
- プロジェクト設定でテクスチャ圧縮や 16bit から 8bit に変更可能
キャラクター向けのカプセルシャドウ
- キャラをカプセルで近似表現
- シンプル, やわらかいシャドウを実現
- スケルタルメッシュごとに有効にする
- 注意点
- 輪郭がはっきりとしたシャドウではなくなる
- カプセルが大きすぎると, 壁や床を貫通することがある
動的ライトの距離カリング
- ゲームの特性上, ポイントライトが 100 個ぐらい出ることがある
- 遠いポイントライトについてはプレイヤーが気づかないことが多い
- 距離に応じてポイントライトをカリングするようにしている
- ポイントライトの Performance -> Max Draw Distance より遠いと消える
- Max Distance Fade Range でフェードさせることができる
動的なシャドウのキャッシュ
- Movable なライトでも, ライトとオブジェクトが動かないときには動的シャドウをキャッシュする
- オブジェクト(Primitives)が Static or Stationary で, ライトが Movable の場合
- 但し, キャッシュするときの初回のコストはそのまま
- 3 つのライトに対してこれをすると
- 14.89 msec -> 0.9 msec に GPU 負荷が減少
ボリューメトリックライティングについては別の講演で説明される