動画とスライドは https://replay.unrealsummit.co.kr/ にあります。
GDC 2018でもほぼ同じ内容で講演されていますが、Unreal Summitの講演にはVolumetric LightingやTime of Dayの実演や質疑応答が追加で含まれています。
要約
- 事前計算の影は使わず、影はリアルタイムに計算している
- レベルに配置されたStatic MeshからMesh Distance Fieldが生成されている
- Mesh Distance Fieldにより、ソフトシャドウ、アンビエントオクルージョン、パーティクルコリジョンを実現
- スケルタルメッシュの影生成は影生成専用のカプセルで構成されたモデルが使われている
- Time of Dayを実現。24時間どの時間にも設定可能で、太陽と月が時間に追従して動く。これはFORTNITE専用に組まれた機能だが、エンジンレベルで事前計算の影が使われていないことを示している
MESH DISTANCE FIELDについて
- FORTNITEでは様々なオブジェクトを壊せるので事前計算した影は使えないが、リアルな影を使いたい
- Mesh Distance Fieldをレイトレースすることでソフトシャドウを実現
- 3Dテクスチャに最も近いメッシュの面までの距離を格納している。プラスならメッシュの外、マイナスならメッシュの中(Signed Distance Field、SDFとも)
- 3Dテクスチャはエディタで事前計算される
DISTANCE FIELDの影の作り方(実演あり)
- Mesh Distance Fieldはプロジェクト設定によって有効化しなければいけない
- Mesh Distance Fieldのビジュアライズ機能で可視化して確認できる
- ダイナミックライトを使ってもソフトシャドウが出来る。(Spot LightアクタのRay Traced Distance Shadowsにチェック)
- Static Meshをエディタで開き、Distance Field Resolution Scaleで解像度を調節
- Static MeshのDistance Field Replacement Meshはレンダリング用のメッシュとDistance Field生成用のメッシュを別にしたいときに使う。
- Distance Field Replacement Meshを指定する副次的メリットとして、LODをビルボードにしているときにもボリューメトリックシャドウを描ける。
パフォーマンスや制限など
- DFはCascade Shadow Mapに比べ30%から50%程軽量
- 近景はCascade Shadow Map、遠景はDistance Field Shadowにすることでパフォーマンスとクオリティを両立。境界近くではブレンドも行う
- DFはGPUにおいて数ミリセカンド節約になる
- Visualize機能で DFAOを可視化できる
- SkyLightをMovableに設定し、スカイライトで設定値を変更する。(ただし、FORTNITEではWorld Settingの中にライティング設定値をもたせているので、実演ではWorld Settingで)
- Occlusion Max Distanceを大きくすると暗くなる。他のオブジェクトに到達しやすくなるため。ただし、大きくすると重くなる
- Occlusion ContrastでAOの強度設定
- Occlusion ExponentでAOの"fall-off"を調整
GLOBAL DISTANCE FIELDについて
- 全てのメッシュにDFをもたせる必要はなく、Global Distance Fieldが存在する。これはカメラの移動に伴い計算が実行される
- DFAOの他、パーティクルコリジョンにも使う
- プレイヤーがテレポートするとGlobal DFが全計算され、一瞬重くなる
MESH DISTANCE FIELDの制限と考慮点
- DX11以上のみ
- メッシュの変形が反映されないという欠点がある(ゆれる木等)
- 軸ごとのスケール値が異なる不均等スケールに対応できない(多少の不均等は許容できる場合も)
- 大きなメッシュはディテールを損なわれる傾向。小さいメッシュに向いている。FORTNITEは小さなメッシュの組み合わせで大きな建物を構成
- 解像度は慎重に設定すべき
MESH DISTANCE FIELDの最適化について
- r.AOListMeshDistanceFields でDFに使われているメモリをダンプ
- プロジェクト設定でMesh Distance Fieldを圧縮できる。メモリを節約できるが、レベルのストリーミングで解凍処理が走りヒッチ(Hitch=瞬間的な負荷でフレームレートが落ちること)が発生するかもしれない
- プロジェクト設定で8-bit Mesh Distance Fieldにできる(デフォルトは16-bit) 品質は落ちるが、FORTNITEでは8-bitでも悪くなかった。
キャラクタのカプセルシャドウ
- 軽い、ソフトシャドウもできる
- SkeletalMeshActorのCapsule Direct Shadowをチェックすることで有効化
- shadow physics assetを用意しなければいけない。キャラクタを構成する剛体の形状はカプセルだけが許されている(ソフトシャドウの計算に向いている)
- 仕組み上、影が壁や床を突き抜けて生成されることも
ダイナミックライトの距離カリング
- ポイントライトなどに個別に設定
- 見えなくて気づかないかもしれないが、距離内にあると計算が発生していることに注意
- パフォーマンスのために必ず忘れずに設定するように!(アーティストがいつも設定し忘れるそうです)
DYNAMIC SHADOW CACHING
- 動いていないライトと動いていないオブジェクトがあったら影計算結果を再利用
- 初回フレームはキャッシュしない場合と同様の負荷がかかる
- 何も設定しなくてもいい!デフォルトで有効になっている
- ただし条件あり。プリミティブはStaticかStationary、ライトはMovable
VOLUMETRIC LIGHTING
- 最近Volumetric Fogが実装された
- Volumetric FogはExponential Height Fog Actorの設定項目になっている
- スライドによると、Volumetric LightingのGDCセッションがある (これかと思います https://www.youtube.com/watch?v=Xd7-rTzfmCo )
VOLUMETRIC FOGの実演デモ(以下の項目それぞれFORTNITEを使って値を変えて実演)
- Density - 霧の濃さ
- Scattering Distribution - フォグが指向性をもつか
- Albedo フォグがどれだけ光を反射させるか(色で指定)
- Extinction Scale Controls - フォグのfalloffの調整 ライトが霧に隠れる程度の調整
- View Distance - Volumetric FogとExponential Height Fogとの切り替え地点の調整
- ポイントライトアクタに Cast Volumetric Shadowにチェックを入れることで霧の中にライトを遮蔽した影を入れることができる。Volumetric Scattering Intensityでその程度を調整できる
FORTNITEのTime of Day(TOD)
- 以下はFORTNITEに特化した実装の話
- TOD機能が実装され、World Settingから朝、昼、夕、夜(又はスライダから24時間中のどんな時間でも)を選ぶだけで太陽、月、Exponential Height Fog、スカイライト、atmosphericsが設定される
- 上の環境設定は全てのレベルで一律であり、エンジニアがC++で実装した。アーティストはレベル毎に個別に設定する必要がない
- (質疑応答時間の回答にて)リリースされているUE4にはこの機能は無いが、望むならあなたが同じようなものを作ればいい。ただし、もしかすると後日サンプルを公開するかも?
(追記 2019/04/06 UE4.21で Sun Position Calculator pluginとして提供されています!)
Time of Dayを実装したゲームエンジンとしてCRYENGINEがありましたが、Mesh/Global Distance FieldはそれらをUE4で実装するのに使えそうです。
UE4上でTODを実現するためには必要な機能をプログラマが組む必要があり、手法の検証にコストがかかりそうな印象でした。これもFORTNITEにより手法が提示されたことでハードルが下がったと感じます。後日TODの機能またはサンプルがEpic Gamesから提供されれば、更にオープンワールドの様なゲームの開発がはかどりそうです。
No comments:
Post a Comment