可動スカイ ライトのシャドウイングは、事前に計算された符号付き距離フィールド ボリュームをそれぞれの剛体メッシュの周りで使用して中程度のアンビエント オクルージョンを生成することにより提供されます。Unreal Engine では、これを 距離フィールド アンビエント オクルージョン (Distance Field Ambient Occlusion:DFAO) と呼びます。これは動的なシーン変化をサポートしているため、剛体メッシュを移動したり非表示にすることができ、オクルージョンにも影響します。スクリーン スペース アンビエント オクルージョン (Screen Space Ambient Occlusion:SSAO) とは異なり、オクルージョンはワールド空間オクルーダから計算されるため、画面外の欠損データによるアーティファクトはありません。
この動的 AO ソリューションには動的なシーン変化のサポートを可能にする侵害制限があるため、すべてのプロジェクトで機能するわけではありません。具体的には、わずかに不均等なスケーリング (スキッシュ) のみがサポートされています。また、小さなボリュームのテクスチャがすべてのオブジェクトにマッピングされているため、大きなスタティックメッシュの場合は品質が低下します。
シーンを設定する
この機能を使用するには、[Rendering (レンダリング)] セクションの [Project Settings (プロジェクト設定)] で [Generate Mesh Distance Fields (メッシュ距離フィールドの生成)] を有効にしておく必要があります。詳しくは、「メッシュ距離フィールド」ページを参照してください。
距離フィールド アンビエント オクルージョンを有効にするには、スカイ ライト をシーンにドラッグし、その [Mobility (可動性)] を [Movable (ムーバブル)] に設定します。
設定手順についての詳細は、「距離フィールド アンビエントオクルージョン」 のガイドを参照してください。
スカイ ライト
Sky Light コンポーネントでは、距離フィールド アンビエントオクルージョン で提供されているさまざまな設定を調整することができます。

次の画像は、調整可能な設定の比較です。
オクルージョンのコントラスト


最小オクルージョン


オクルージョンの色合い


スカイ ライトの設定に関する追加情報やさらなる例は、「メッシュ ディスタンス フィールドの設定のリファレンス」ページを参照してください。
シーンの表現
距離フィールド AO の表示モードにより、他のライティングを考慮せずにレベルでの DFAO の外観を確認することができます。
シーン アンビエント オクルージョンを表示する距離フィールドは、[Show] > [Visualize] > [Distance Fields Ambient Occlusion] を選択して 距離フィールド アンビエント オクルージョン のレベル ビューポートの表示モードを使用すると視覚化できます。
画像をクリックすると拡大表示されます。
この表示モードでは、「スカイ ライトの設定」でエフェクトがあるのは Occlusion Max Distance のみとなります。

品質
距離フィールド AO の品質は、表示するメッシュ距離フィールドの解像度により決定します。AO は非常にソフトなシャドウイングのため、サーフェスが 正しく表示されない場合にも、サーフェスから遠いオクルージョンは正確に表示されます。これは Sky オクルージョンではあまり目立ちませんが、メッシュの大きなディテールが メッシュ距離フィールドではきれいに表示されていることを確認してください。メッシュ距離フィールドのビジュアリゼーション を使用して 品質を確認します。
メッシュ距離フィールドの品質に関する追加情報は、「メッシュ距離フィールド」ページを参照してください。
オクルージョンの結果
拡散
距離フィールド AO は、(オクルージョン係数を使用して) ディフューズ スカイ ライト計算を修正するために使用するベント法線 (オクルージョンが最小になる方向) を作成します。


この例は、フォートナイトの正午のレベルです。フォートナイトでは、プレイヤーはあらゆる壁、床、天井も倒して新しく作成することができるため、それに対応してライティングも更新する必要があります。距離フィールド AO は、周囲のレベルにおけるこれらの動的変化をサポートします。
スペキュラ
距離フィールド AO は、スカイ ライトに大まかなスペキュラ オクルージョンも作成します。これは、指向性オクルージョン コーンがリフレクション コーンと交差することで計算されます (サイズはマテリアルのラフネスに依存します)。


パイプのスペキュラ オクルージョン。
デフォルトでは、指向性以外の AO はスペキュラに適用されます。r.AOSpecularOcclusionMode を使用すると、リフレクション コーンと DFAO が作成したオクルードされていないコーンを交差させるデフォルトのメソッドに比べ、より正確なオクルージョン結果を得ることができます。この場合は DFAO のサンプリング アーティファクトが生成されることに注意してください。
フォリッジ
フォリッジ ツール を使用してペイントされたアクタの場合は、最初にツール設定の [Affect Distance Field Lighting (距離フィールド ライティングに影響する)] オプションを有効にする必要があります。

距離フィールド AO はサーフェス上で実行されますが、多数の小さな葉がシートにまとめられているフォリッジを処理することができます。スタティックメッシュ エディタ の [Build Settings (ビルド設定)] オプションでフォリッジ タイプのアセットに対して [Two-Sided Distance Field Generation] を有効にすると、最善の結果を得ることができます。これにより、計算されたオクルージョンがソフトになります。
[Sky Light] オプションで [Min Occlusion] の値を増やし、アセット内部の黒潰れを防ぎます。

これは、DFAO が有効で、[Two-Sided Distance Field Generation] を使用している例です。


LOD (詳細度) を使用するフォリッジ アセットでは、距離フィールド AO により過度なオクルージョンが発生する場合があります。これは遠方の メッシュ距離フィールド が 正確であるのに対して LOD レベルで使用するトライアングル数が少なく、生成されたメッシュ距離フィールド内に縮小している場合に発生します。
対処法として、それらの LOD に [World Position Offset (ワールド位置オフセット)] を使用して頂点を距離フィールドの外に出すことができます。通常は、カメラに対してオフセットを小さくすると アーティファクトを解決することができます。ビルボードの場合は、[Pixel Depth Offset (ピクセル深度オフセット)] 機能を使用して元の 3D トライアングル メッシュをより良く表示する有効な深度の値を使用します。これは GDC でのデモ「A Boy and His Kite」で使用された技法で、長い表示距離を距離フィールドに依存しています。


遠方のツリー ビルボードにおける過度なオクルージョン。Pixel Depth Offset と Skylight Min Occlusion を使用して濃い影を軽減します。
ランドスケープ
ランドスケープは、メッシュ距離フィールドの代わりに高さフィールドを使用して表現します。これは、高さフィールドに対して計算される近似のコーン交点を使用して、 距離フィールド表現のないピクセルがオクルージョンを受け取れるようにします。ただし、セルフシャドウイングや距離フィールド シャドウイングはありません。代わりに、ランドスケープは遠距離に対してカスケード シャドウ マップ (CSM) のある Far Shadows を 使用する必要があります。

DFAO ビジュアリゼーション表示モードにおけるランドスケープ オクルージョン。
パフォーマンス
距離フィールド AO の負荷要因は、主に GPU 時間とビデオ メモリです。DFAO は中程度のスペックの PC、PlayStation 4、および Xbox One で実行できるように最適化されています。現在、 負荷の信頼性も高くなり、ほぼ安定しています (ただし、オブジェクトの密度に若干依存します)。
ほぼフラットなサーフェスで静的カメラを使用して実行する場合、DFAO は以前の実装と比べて 1.6 倍速くなります。フォリッジのある複雑なシーンで高速移動するカメラを使用する場合、最新の最適化では 5.5 倍速くなります。PlayStation 4 におけるフル ゲーム シーンでの距離フィールド AO の負荷は、おおよそ 3.7 ms です。
最適化
以下は、高速化、効率化、外観の改善のために DFAO に追加された最適化の一部です。
一般的な改善事項
Unreal Engine 4.16 では、PlayStation 4 を使用したテスト結果を元に、DFAO にいくつかの改善を行いました。
最適化 | 改善前 (ms) | 改善後 (ms) | 差 (ms) |
---|---|---|---|
カリング アルゴリズムを変更し、オブジェクトごとに交差する画面タイルのリストが生成されるようになりました。各タイル / オブジェクトの交差によりコーン トレーシング スレッド グループを取得し、波面を小さくしてスケジュール化しやすくなりました。 | 3.63 | 3.48 | 0.15 |
内部ループの遅い命令を速い近似値に置き換えました | 3.25 | 3.09 | 0.16 |
トランスフォームをワールドの内部ループからローカル空間へ移動しました (ローカル空間位置 + 方向から作成されたサンプル位置)。 | 3.09 | 3.04 | 0.05 |
ClearUAV のシェーダが計算されるようになりました。 | 3.04 | 2.62 | 0.42 |
スムーズ サンプリング
DFAO にスムーズ サンプリングを使用する前に適応サンプリングを使用したため、フォリッジのような多数のサーフェスを持つ高密度のシーンに比べるとフラットなサーフェスでの作業量は軽減されます。ただし、 クリーンな環境に多数の汚れが表示されることにもなります。
スムーズ サンプリングでは、より長い履歴フィルタが必要になります。これは、特にシャドウ キャスターが移動した場合に「ゴースト」(移動オブジェクトの後ろに表示されるトレイル) の要因にもなります。Unreal Engine 4.16 以降では、 ゴーストは距離フィールドの一時フィルタに [Confidence (信頼度)] の値を格納することにより改善されています。これはアップサンプル中にオクルージョンの漏れをトラックし、履歴から漏れた値を迅速にフラッシュするために 使用されます。これにより、カメラや動的オブジェクトが高速移動する際に発生するゴーストを全体的に減らすことができます。
次の例では、AO 計算が高速化して適応サンプリングが使用されなくなった結果、オクルージョンが大幅にスムーズになっています。


Scene View


DFAO ビジュアリゼーション
グローバル距離フィールド
グローバル距離フィールドは、カメラを追いかけながらレベルで符号付き距離フィールド オクルージョンを使用する低解像度の距離フィールドです。オブジェクトごとにメッシュ距離フィールドのキャッシュを作成し、カメラの周囲を中心とするいくつかのクリップマップと呼ばれるボリューム テクスチャにコンポジットします。このときに更新する必要があるのは、新しく見えるようになったエリア、またはシーン変更の影響を受けたエリアのみになるため、コンポジットによる負荷はそれほどかかりません。
クリップマップはカメラの周囲で 4 分割され、必要な場合にのみ更新されます。更新されるのは、カメラ移動により新しい部分またはオブジェクトが動かないことで その影響範囲に汚れが発生したことが判明した場合です。この状態での平均負荷はゼロに近いものですが、テレポートなどを実行すると、最悪の場合は更新負荷が 高くなります。

それぞれのクリップマップが異なる色で表現される、テクセル サイズでのクリップマップのビジュアリゼーション。
オブジェクトの距離フィールドの解像度が低いということは、これをすべてに使用できるということを意味します。ただし、Sky オクルージョンのコーン トレースを計算する場合、オブジェクト距離フィールドはシェーディングされるポイントの近くでサンプリングされます。一方、グローバル距離フィールドは遠くでサンプリングされます。
ビューポートのグローバル距離フィールドは、[Show] > [Visualize] > [Global Distance Fields] をクリックして視覚化することができます。
画像をクリックすると、拡大表示されます。
次の図は、オブジェクトごとのメッシュ距離フィールドのビジュアライゼーションと、カメラ ビューと距離に基づいてクリップマップで組み合わせたグローバル距離フィールドのビジュアライゼーションの比較です。


グローバル距離フィールドは、そのオブジェクトの距離フィールドより解像度が低いため、サーフェス近くのグローバル距離フィールドは精度が低下します。コーン トレースが発生すると、オブジェクトの距離フィールドは オクルージョン コーンと残りのトレース用のグローバル距離フィールドの開始地点付近で使用されます。これにより、正確なセルフオクルージョンと効率的な長距離トレースが取得されるため、よりきれいに表示されます。そのため、有効な最大オブジェクトの影響距離が劇的に減少し、スカイ オクルージョンのパフォーマンスが 5 倍向上します。
制限事項
テクニックに関する制限事項
- ブロック距離に制限があるため、スカイ オクルージョンとは異なりアンビエントオクルージョンのみが提供されます。
- シャドウは剛体メッシュからのみキャストされます。スケルタルメッシュの場合、間接的にライティングされるエリアには カプセル シャドウ を使用します。
現在の実装に対する制限事項 (今後改善される可能性があります)
- 動的なシーンから AO に更新すると、機能が複数のフレームに拡大し、新しいサンプルが生成されるとオクルージョンが若干シフトするため、ラグがわずかに変化します。これは、Unreal Engine 4.16 以降では信頼度の値を格納する距離フィールドの一時フィルタが備わったことで改善されています。信頼度の値はアップサンプル中にオクルージョンの漏れをトラックし、履歴から漏れた値を迅速にフラッシュするために使用されます。これにより、カメラの移動時に発生するゴーストが減少します。
- 大きなオブジェクトは距離フィールドの解像度を低下させ、AO の品質も悪くなります。これはボリューム テクスチャが各メッシュにマッピングされることによります。
距離フィールドの制限事項については、「距離フィールド」ページを参照してください。
ヒントとコツ
負荷の少ないバウンス ライト
スカイ ライトの [Lower Hemisphere is Solid Color (下半球はソリッド カラー)] のチェックを外し、グラウンド カラーの一部をキューブマップにペイントすると、負荷をかけずに太陽光がバウンスしているように表示することができます。 これはディレクショナル ライトのシャドウイングを考慮していないため、室内では光が漏れますが、屋外のシーンには有効です。