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

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

Windows
MacOS
Linux

DistanceFieldAmbientOcclusion_Header.jpg

それぞれの剛体メッシュの周囲で事前計算された Signed Distance Field Volumes を使って中程度のアンビエント オクルージョンを生成する新機能が、Movable Sky Light (可動スカイライト) のシャドウイングに備わりました。Unreal Engine 4 (UE4) ではこの機能は
Distance Field Ambient Occlusion (DFAO) と呼ばれます。動的シーンの変更をサポートしているので、剛体メッシュの移動あるいは非表示が可能となり、オクルージョンにも影響します。Screen Space Ambient Occlusion (SSAO) とは異なり、 オクルージョンはワールド スペース オクルーダから計算されるので、オフスクリーン上でデータ不足によるアーティファクトは生じません。

この動的 AO ソリューションは、動的シーンの変更に対応できるように侵害制限をかけているので、すべてのプロジェクトで機能するわけではありません。具体的には、 わずかに不均一なスケーリング (スキッシュ) だけをサポートします。また、小さいボリューム テクスチャがオブジェクトごとにマップされるので、大きいスタティックメッシュは結果としてクオリティが低くなります。

シーンの設定

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

Distance Field Ambient Occlusion を有効にするために、スカイライト をシーンにドラッグし [Mobility] を [Movable] に設定します。

段階的な操作については Distance Field Ambient Occlusion 操作ガイドをご覧ください。

スカイライト

Sky Light コンポーネントを使って、Distance Field Ambient Occlusion の中にある各種設定を調節することができます。調節した設定を比較すると、例えばこのようになります。

Occlusion Contrast

Occlusion | Contrast: 0

Occlusion | Contrast: 1

最小のオクルージョン

Min Occlusion: 0

Min Occlusion: 1

Occlusion Tint

Occlusion Tint: | Black

Occlusion Tint: | Red

スカイライトの設定の詳細およびその他のサンプルは、ディスタンス フィールド リファレンス を参照してください。

シーンの表現

ディスタンス フィールド AO を使うと、DFAO がレベル内でどのように見えるのか、他のライティングを考慮せずに表示することができます。

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

DFAOVisualize.png

このビューモードの間は、エフェクトのある Skylight 設定Occlusion Max Distance のみです。

DFAOView.png

品質

Distance Field AO の品質は、表示するメッシュ ディスタンス フィールドの解像度によって決まります。AO は非常にソフトなシャドウイングなので、 サーフェスが正しく表現されていない場合でも、サーフェスから先のオクルージョンは正確になります。スカイ オクルージョンでは気が付くことは滅多にありませんが、メッシュの大き目のディティールがメッシュ ディスタンス フィールドでうまく表示されているか 確認してください。メッシュ ディスタンス フィールドの視覚化 を使って品質を確認します。

メッシュ ディスタンス フィールドの品質の詳細は、ディスタンス フィールド を参照してください。

オクルージョンの結果

ディフューズ

DFAO は、オクルージョンに加えて、スカイライト ディフューズの計算に使用するベント法線 (オクルージョンが最小になる方向) を作成します。ディスタンスフィールド アンビエントオクルージョンの比較です。

なし

あり

この Fortnite からのサンプルは、正午のワンシーンのレベルです。Fortnite では、プレイヤーはどんなウォールも倒して新しくビルドできるので、ライティングもそれに合わせて更新しなければなりません。距離 Field AO は周囲のレベルにおけるこのような動的変化をサポートしています。

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

スペキュラ

ディスタンス フィールド AO により、スカイライト上におおよそのスペキュラ オクルージョンが作成されます。これは、指向性オクルージョン コーンがリフレクション コーンと相互作用することで計算されます (サイズはマテリアルのラフネスによります)。スペキュラ オクルージョンの比較です。

なし

あり

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

デフォルトでは、指向性以外の 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 を使用した例です。

スクリーンスペース アンビエントオクルージョンのみ

フォリッジ上のディスタンスフィールド アンビエントオクルージョン

LOD (Level of Detail) を伴うフォリッジの場合、Distance Field AO に問題が発生することがあります。これは、メッシュ ディスタンス フィールド が遠方でも正確であるのも関わらず、 LOD レベルが使用するトライアングル数が低いため、生成されたメッシュ ディスタンス フィールド内に縮小する場合に発生します。

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

なし

あり

影が濃すぎるディスタンス ツリー ビルボードをPixel Depth Offset と Skylight Min Occlusion で補正する様子

ランドスケープ

ランドスケープは Mesh Distance Field の代わりにハイトフィールドを使って表現します。ランドスケープは、ハイトフィールドに対して計算される近似のコーン交差を使用して、 ディスタンス フィールド表現のないピクセルがオクルージョンを受け取れるようにします。ただし、セルフ シャドウイングやディスタンス フィールド シャドウイングがないので、ランドスケープの場合、遠くの距離には カスケード シャドウ マップ (CSM) のある Far Shadows を使用しなければなりません。

Landscape.png

DFAO ビジュアル化ビュー モードで表示されたランドスケープ オクルージョン

パフォーマンス

ディスタンス フィールド AO の主な負荷要因は、GPU 時間とビデオメモリです。DFAO は中程度のスペックの PC や PlayStation 4 および Xbox One で実行できるように最適化されました。現在、負荷の信頼性も高くなり、ほぼ安定しました (オブジェクトの密度への若干の依存あり)。

ほぼフラットなサーフェスで静的カメラを使ってこの新しいメソッドを実行すると、これまでの速度の 1.6 倍になります。フォリッジのある複雑なシーンで高速カメラを使うと、 最新の最適化は 5.5 倍の速さになります。PlayStation 4 の場合、フル ゲーム シーンへのディスタンス フィールド AO 負荷は 3.7 ms になります。

最適化

以下は、高速化、効率化、外観の改善のために DFAO に追加された最適化の一部です。

一般的な改善

PlayStation 4 を使ったテスト結果を元に、Unreal Engine 4.16 で行われた 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 以降では、 Distance Field 一時フィルタに信頼値を格納することでゴースト問題は改善されています。信頼値は、アップサンプル時のオクルージョン漏れをトラックし、 履歴から漏れた値を迅速にフラッシュするために使用されています。これにより、カメラや動的オブジェクトが高速で移動する際に発生したゴースト問題を全体的に減らすことができました。

以下のサンプルでは、AO の演算処理が速くなり適応サンプリングがいらなくなったので、オクルージョンが格段にスムーズになりました。

Adaptive Sampling

Smooth Sampling

Adaptive Sampling

Smooth Sampling

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

Global Distance Field は、カメラを追いかけながらレベル内で Signed Distance Fields オクルージョンを使用する、低解像度の Distance Field です。オブジェクト毎に Mesh Distance Field のキャッシュを作成し、それをカメラ周囲を中心としたクリップマップと呼ばれるいくつかのボリューム テクスチャに合成します。新たに見えるエリアや、シーンの変更の影響を受けるエリアだけを更新する必要があります。そのため、合成の負荷はあまりかかりません。

クリップマップはカメラ周辺で 4 枚に分割され、必要な場合のみアップデートされます。 それは、カメラの移動により、新しい部分またはオブジェクトが全く動かないためにその影響範囲に汚れの発生が見つかった場合です。その状態での平均負荷はゼロに近いですが、 テレポートのような操作を行うと、最悪の場合、アップデート負荷が高くなります。

DF_ClipMap.png

クリップマップをテクセル サイズでビジュアル化すると、それぞれのクリップマップが違う色で表現されます。

スカイ オクルージョンでコーン トレースを演算処理する場合、オブジェクトの Distance Field はシェーディングされているポイント近くでサンプリングされます。一方、はるかに高速な Global Distance Field はさらに離れた場所でサンプリングされます。

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

制限事項

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

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

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

現在の実装の制限事項 (今後改善される見込みです)

  • 動的シーンから AO へ更新すると機能が複数のフレームへ広まり、新たにサンプルが作成されるオクルージョンが少しラグが若干変わります。アップサンプル時のオクルージョン漏れをトラックし、履歴から漏れた値を迅速にフラッシュするために使われる信頼値をディスタンス フィールド テンポラル フィルタに格納することでUnreal Engine 4.16 以降でこの問題は改善されました。カメラの移動中のゴーストの発生も抑えやすくなりました。

  • ボリューム テクスチャはそれぞれのメッシュにマップされるので、オブジェクトが大きいとディスタンス フィールドの解像度が低く、そのため AO 品質が悪くなります。

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

ヒントとコツ

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

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

Select Skin
Light
Dark

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

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

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

フィードバックを送信