ディスタンス フィールド アンビエント オクルージョン

メッシュディスタンス フィールドを使ってスカイライトに動的アンビエント オクルージョンを作成する方法の概要です。

![Banner image](dfao-banner.png)

可動 (Movable) スカイ ライトのシャドウイングは、事前に計算された符号付きディスタンス フィールド ボリュームをそれぞれの剛体メッシュの周りで使用して中程度のアンビエントオクルージョンを生成することにより提供されます。Unreal Engine ではこの機能は
ディスタンス フィールド アンビエント オクルージョン (Distance Field Ambient Occlusion) (DFAO) と呼ばれます。これは動的なシーン変化をサポートしているため、剛体メッシュを移動したり非表示にすることができ、オクルージョンにも影響します。スクリーン スペース アンビエントオクルージョン (SSAO) とは異なり、オクルージョンはワールド空間オクルーダから計算されるため、画面外の欠損データによるアーティファクトはありません。

この動的な AO ソリューションには動的なシーン変化のサポートを可能にする侵害制限があるため、すべてのプロジェクトで機能するわけではありません。具体的には、 具体的には、わずかに不均等なスケーリング (スキッシュ) のみがサポートされています。また、小さなボリュームのテクスチャがすべてのオブジェクトにマッピングされているため、大きなスタティック メッシュの場合は品質が低下します。

シーンを設定する

この機能を使用するには、[Rendering (レンダリング)] セクションの [Project Settings (プロジェクト設定)][Generate Mesh Distance Fields (メッシュディスタンス フィールドの生成)] を有効にする必要があります。詳細は、「メッシュ ディスタンス フィールド」を参照してください。

ディスタンス フィールド アンビエントオクルージョンを有効にするには、スカイライト をシーンにドラッグし、その [Mobility (可動性)] を [Movable (可動)] に設定します。

設定手順についての詳細は、「ディスタンス フィールド アンビエントオクルージョン 操作ガイド」を参照してください。

スカイライト

Sky Light コンポーネントでは、ディスタンス フィールド アンビエントオクルージョン で提供されているさまざまな設定を調整することができます。次の画像は、調整可能な設定の比較です。

![Distance Field Ambient Occlusion Settings of the Sky Light](01-dfao-sky-light-dfs-settings.png)

以下は、調整可能な設定の比較です。

Occlusion Contrast

![Occlusion | Contrast: 0](02-dfao-contrast-0.png)(w:900)

![Occlusion | Contrast: 1](03-dfao-contrast-1.png)(w:900)

Minimum Occlusion

![Min Occlusion: 0](04-dfao-min-occlusion-0.png)(w:900)

![Min Occlusion: 1](05-dfao-min-occlusion-1.png)(w:900)

Occlusion Tint

![Occlusion Tint: | Black](06-dfao-min-occlusion-tint-0.png)(w:900)

![Occlusion Tint: | Red](07-dfao-min-occlusion-tint-1.png)(w:900)

スカイライトの設定に関する追加情報や他のサンプルは、「ディスタンス フィールド リファレンス」を参照してください。

シーンの表現

ディスタンス フィールド AO の表示モードにより、他のライティングを考慮せずにレベルでの DFAO の外観を確認することができます。

[Show (表示)] > [Visualize (視覚化)] > [Distance Fields Ambient Occlusion] を選択して、ディスタンス フィールド アンビエント オクルージョン のレベル ビューポートの表示モードを使用すると視覚化できます。

画像をクリックして拡大表示します。

この表示モードでは、スカイライトの設定 でエフェクトがあるのは Occlusion Max Distance のみです。

![Example of DFAO visualization mode](09-dfao-example-dfao-visualization-mode.png)(w:900)

品質

ディスタンス フィールド AO の品質は、表示するメッシュ ディスタンス フィールドの解像度により決定します。AO は非常にソフトなシャドウイングのため、 サーフェスが正しく表現されていない場合にも、サーフェスから遠いオクルージョンは正確に表示されます。これは Sky オクルージョンではあまり目立ちませんが、メッシュの大きなディテールがメッシュディスタンス フィールドではきれいに表示されていることを 確認してください。メッシュ ディスタンス フィールドのビジュアリゼーション を使用して 品質を確認します。

メッシュ ディスタンス フィールドの品質に関する追加情報は、「ディスタンス フィールド」を参照してください。

オクルージョンの結果

ディフューズ

ディスタンス フィールド AO は、(オクルージョン係数を使用して) ディフューズ スカイ ライト計算を修正するために使用するベント法線 (オクルージョンが最小になる方向) を作成します。

![No Distance Field Ambient Occlusion](10-dfao-default-1.png)(w:900)

![Distance Field Ambient Occlusion](11-dfao-enabled-dfao.png)(w:900)

この例は、Fortnite の正午のレベルです。Fortnite では、プレイヤーはあらゆる壁、床、天井も倒して新しく作成することができるため、それに対応してライティングも更新する必要があります。ディスタンス フィールド AO は、周囲のレベルにおけるこれらの動的変化をサポートします。

スペキュラ

ディスタンス フィールド AO は、スカイ ライトに大まかなスペキュラ オクルージョンも作成します。これは、指向性オクルージョン コーンがリフレクション コーンと交差することで計算されます (サイズはマテリアルのラフネスに依存します)。

![スペキュラ オクルージョン なし](12-dfao-default-2.png)(w:900)

![スペキュラ オクルージョン](13-dfao-enabled-specular-occlusion.png)(w:900)

パイプのスペキュラ オクルージョン。

デフォルトでは、指向性以外の AO はスペキュラに適用されます。r.AOSpecularOcclusionMode を使用すると、リフレクション コーンと DFAO が作成したオクルードされていないコーンを交差させるデフォルトのメソッドに比べ、より正確なオクルージョン結果を得ることができます。この場合は DFAO のサンプリング アーティファクトが生成されることに注意してください。

フォリッジ

Foliage ツール を使用してペイントされたアクタの場合は、最初にツール設定の [Affect Distance Field Lighting (ディスタンス フィールドライティングに影響する)] オプションを有効にする必要があります。

![Enable the Affect Distance Field Lighting](14-dfao-foliage-tool-settings.png)

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

[Sky Light] オプションで [Min Occlusion] の値を増やし、アセット内部の黒潰れを防ぎます。

![Enable Two-Sided Distance Field Generation](15-dfao-two-sided-distance-field.png)

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

![SSAO のみ](16-dfao-disabled-dfao.png)(w:900)

![フォリッジに DFAO](17-dfao-enabled-dfao.png)(w:900)

LOD (詳細度) を使用するフォリッジ アセットでは、ディスタンス フィールド AO により過度なオクルージョンが発生する場合があります。これは遠方の メッシュ ディスタンス フィールド 正確であるのに対して LOD レベルで使用するトライアングル数が少なく、生成されたメッシュ ディスタンス フィールド内に縮小している場合に発生します。

対処法として、それらの LOD に World Position Offset を使用して頂点をディスタンス フィールドの外に出すことができます。通常は、カメラに対してオフセットを小さくすると アーティファクトを解決することができます。ビルボードの場合は、Pixel Depth Offset 機能を使用して元の 3D トライアングル メッシュをより良く表示する有効な深度の値を作成します。これは GDC でのデモ「A Boy and His Kite」で使用された技法で、長い表示距離をディスタンス フィールドに依存しています。

![ピクセル深度オフセットなし](18-dfao-bilboard-no-pixel-depth-offset.png)(w:900)

![ピクセル深度オフセット](19-dfao-bilboard-with-pixel-depth-offset.png)(w:900)

遠方のツリー ビルボードにおける過度なオクルージョン。Pixel Depth Offset と Skylight Min Occlusion を使用して濃い影を軽減します。

ランドスケープ

ランドスケープは、メッシュ ディスタンス フィールドの代わりに高さフィールドを使用して表現します。これは、高さフィールドに対して計算される近似のコーン交点を使用して、 ディスタンス フィールド表現のないピクセルがオクルージョンを受け取れるようにします。ただし、セルフシャドウイングやディスタンス フィールド シャドウイングはありません。代わりに、ランドスケープは遠距離に対してカスケード シャドウ マップ (CSM) のある Far Shadows を 使用する必要があります。

![Landscape](20-dfao-landscape.png)(w:900)

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 計算が高速化して適応サンプリングが使用されなくなった結果、オクルージョンが大幅にスムーズになっています。

![アダプティブ サンプリング](21-dfao-scene-old-method.png)(w:900)

![スムーズ サンプリング](22-dfao-scene-new-method.png)(w:900)

シーン ビュー

![アダプティブ サンプリング](23-dfao-old-method-dfao-view-mode.png)(w:900)

24-dfao-new-method-dfao-view-mode.png)(w:900)DFAO_View_NewMethod.png)(w:590)

DFAO ビジュアリゼーション

グローバル ディスタンス フィールド

グローバルディスタンス フィールドは、カメラを追いかけながらレベルで符号付きディスタンス フィールド オクルージョンを使用する低解像度のディスタンス フィールドです。オブジェクトごとにメッシュ ディスタンス フィールドのキャッシュを作成し、カメラの周囲を中心とするいくつかのクリップマップと呼ばれるボリューム テクスチャにコンポジットします。この時に更新する必要があるのは、新しく見えるようになったエリア、またはシーン変更の影響を受けたエリアのみになるため、コンポジットによる負荷はそれほどかかりません。

クリップマップはカメラの周囲で 4 分割され、必要な場合にのみ更新されます。 更新されるのは、カメラ移動により新しい部分またはオブジェクトが動かないことで その影響範囲に汚れが発生したことが判明した場合です。この状態での平均負荷はゼロに近いものですが、 テレポートなどを実行すると、最悪の場合は更新負荷が高くなります。

![Clipmap visualization](25-dfao-clipmap-visualization.png)(w:900)

それぞれのクリップマップが異なる色で表現される、テクセル サイズでのクリップマップのビジュアリゼーション。

オブジェクトのディスタンス フィールドの解像度が低いということは、これをすべてに使用できるということを意味します。ただし、Sky オクルージョンのコーン トレースを計算する場合、オブジェクトディスタンス フィールドはシェーディングされるポイントの近くでサンプリングされます。一方、グローバル ディスタンス フィールドは遠くでサンプリングされます。

ビューポートのグローバルディスタンス フィールドは、[Show] > [Visualize] > [Global Distance Fields] をクリックして視覚化することができます。

クリックしてフルサイズ表示。

次の図は、オブジェクトごとのメッシュ ディスタンス フィールドのビジュアリゼーションと、カメラ ビューと距離に基づいてクリップマップで組み合わせたグローバルディスタンス フィールドのビジュアリゼーションの比較です。

![Mesh Distance Fields Visualization](16-distance-field-mdf-visualization.png)(w:900)

![Global Distance Fields Visualization](17-distance-field-gdf-visualization.png)(w:900)

グローバル ディスタンス フィールドは、そのオブジェクトのディスタンス フィールドより解像度が低いため、サーフェス近くのグローバルディスタンス フィールドは精度が低下します。コーン トレースが発生すると、 オブジェクトのディスタンス フィールドはオクルージョン コーンと残りのトレース用のグローバル ディスタンス フィールドの開始地点付近で使用されます。これにより、正確なセルフオクルージョンと効率的な長距離トレースが取得されるため、よりきれいに表示されます。そのため、有効な最大オブジェクトの影響距離が劇的に減少し、スカイ オクルージョンのパフォーマンスが 5 倍向上します。

制限事項

テクニックに関する制限事項

  • ブロック距離に制限があるため、スカイ オクルージョンとは異なりアンビエントオクルージョンのみが提供されます。

  • シャドウは剛体メッシュからのみキャストされます。スケルタルメッシュの場合、間接的に照らされる領域には カプセル シャドウ を使用します。

現在の実装に対する制限事項 (今後改善される可能性があります)

  • 動的なシーンから AO に更新すると、機能が複数のフレームに拡大し、新しいサンプルが生成されるとオクルージョンが若干シフトするため、ラグがわずかに変化します。これは、Unreal Engine 4.16 以降では信頼度の値を格納するディスタンス フィールドの一時フィルタが備わったことで改善されています。信頼度の値はアップサンプル中にオクルージョンの漏れをトラックし、履歴から漏れた値を迅速にフラッシュするために使用されます。これにより、カメラの移動時に発生するゴーストが減少します。

  • 大きなオブジェクトはディスタンス フィールドの解像度を低下させ、AO の品質も悪くなります。これはボリューム テクスチャが各メッシュにマッピングされることによります。

ディスタンス フィールドの制限事項については、「ディスタンス フィールド 」を参照してください。

ヒントとコツ

負荷の少ないバウンスライト

スカイライトの [Lower Hemisphere is Solid Color (下半球はソリッドカラー)] のチェックを外し、グラウンド カラーの一部をキューブマップにペイントすると、負荷をかけずに太陽光がバウンスしているように表示することができます。 これは指向性ライトのシャドウイングを考慮していないため、室内では光が漏れますが、屋外のシーンには有効です。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル