距離フィールド アンビエント オクルージョン

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

Windows
MacOS
Linux

DistanceFieldAmbientOcclusion_Header.jpg

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

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

シーンを設定する

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

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

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

スカイライト

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

Occlusion Contrast

Occlusion | Contrast: 0

Occlusion | Contrast: 1

Minimum Occlusion

Min Occlusion: 0

Min Occlusion: 1

Occlusion Tint

Occlusion Tint: | Black

Occlusion Tint: | Red

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

シーンの表現

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

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

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

DFAOView.png

品質

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

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

オクルージョンの結果

ディフューズ

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

No Distance Field Ambient Occlusion

Distance Field Ambient Occlusion

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

このサンプルは Fortnite のレベルです。アセットがエディタで非表示にされたり移動されたりすると、リアルタイムで AO が更新されます。

スペキュラ

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

No Specular Occlusion

Specular Occlusion

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

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

フォリッジ

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

FoliageToolSettings.png

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

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

BuildSettings_TwoSided.png

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

Screen Space Ambient Occlusion only

Distance Field Ambient Occlusion on foliage

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

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

No Pixel Depth Offset

Pixel Depth Offset

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

ランドスケープ

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

Landscape.png

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

Adaptive Sampling

Smooth Sampling

シーン ビュー

Adaptive Sampling

Smooth Sampling

DFAO ビジュアリゼーション

グローバル距離フィールド

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

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

DF_ClipMap.png

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

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

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

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

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

Mesh Distance Fields Visualization

Global Distance Fields Visualization

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

制限事項

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

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

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

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

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

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

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

ヒントとコツ

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

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

Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信