Language:
Page Info
Skill Level:
Engine Version:

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

DistanceFieldAmbientOcclusion_Header.jpg

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

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

シーンの設定

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

ディスタンス フィールド アンビエント オクルージョンを有効にするために、スカイライト をシーンにドラッグし [Mobility] を [Movable] に設定します。

スカイライト

ポイントライトとスポットライトの場合は、ソース半径 (Source Radius) を使用して、ポイントライトのシャドウの半暗部の大きさを決定します。エリア シャドウは、 距離が長くなるほどソフトになるシャープなコンタクトで計算されます。ポイントライトおよびスポットライト上では、黄色い球体で表されます。

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

Occlusion | Contrast: 0

Occlusion | Contrast: 1

Min Occlusion: 0

Min Occlusion: 1

Occlusion Tint: | Black

Occlusion Tint: | Red

Occlusion Contrast

Min Occlusion

Occlusion Tint

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

シーンの表現

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

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

画像をクリックしてフルサイズ表示

画像をクリックしてフルサイズ表示

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

品質

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

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

オクルージョンの結果

ディフューズ

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

No Distance Field Ambient Occlusion

Distance Field Ambient Occlusion

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

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

スペキュラ

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

No Specular Occlusion

Specular Occlusion

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

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

フォリッジ

Foliage ツール でペイントされたアクタの場合、ツール設定の [Affect Distance Field Lighting] オプションをまず有効にしなければなりません。

ディスタンス フィールド AO がサーフェス上で実行されていても、多数の小さい葉がシートにまとめられているフォリッジを処理することができます。フォリッジを使ったアセットを一番きれいに表示する方法は、 [Two-Sided Distance Field Generation (両面のディスタンス フィールドを生成する)] を有効にすることです。計算したオクルージョンをソフトにします。スカイライトの [Min Occlusion] はアセット内部の黒潰れを防ぐ場合に便利です。

Screen Space Ambient Occlusion only

Distance Field Ambient Occlusion on foliage

LOD (Level of Detail) を伴うフォリッジは、トライアングル メッシュがディスタンス フィールド内で収縮するのでオクルージョンが出すぎて、ディスタンス フィールド 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 で実行できるように最適化されました。負荷の信頼性も高くなり、 オブジェクトの密度に若干依存しますが、ほぼ一定になりました。

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

最適化

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

一般的な改善

PlayStation 4 を使ったテスト結果を元に、アンリアル エンジン 4.16 で行われた DFAO の改善のいくつかを紹介します。

最適化の内容

改善前 (ms)

改善後 (ms)

差 (ms)

カリング アルゴリズムを変更して、オブジェクトごとに交差する画面タイルのリストが作成されるようにしました。各タイル / オブジェクトの交差でコーン トレース スレッド グループを取得して、波面を小さくしてスケジュール化しやすくしました。

3.63

3.48

0.15

内部ループの処理の遅い命令を速い近似値に置き換えました (exp2 -> sqr + 1, rcpFast, lengthFast).

3.25

3.09

0.16

トランスフォームをワールドの内部ループからローカル スペースに移動しました (ローカル空間位置 + 方向から作成されたサンプル位置).

3.09

3.04

0.05

ClearUAV のシェーダーが計算されるようにしました。

3.04

2.62

0.42

スムーズ サンプリング

適応サンプリングを使用してから DFAO にスムーズ サンプリングを使用したので、フラットなサーフェスに対する作業はフォリッジのようなサーフェスの多い高密度のシーンに比べて少なくなります。ただしこれは、クリーンな背景に 汚れがたくさん表示されることにもなります。

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

Adaptive Sampling

Smooth Sampling

Adaptive Sampling

Smooth Sampling

シーンの表示

DFAO ビジュアル化

スムーズ サンプリングの場合、さらに長い履歴フィルターが必要になります。これは、特にシャドウ キャスターが移動した場合にゴーストの原因になります。アンリアル エンジン 4.16 以降では、 アップサンプル時のオクルージョン漏れをトラックし、履歴から漏れた値を迅速にフラッシュするために使われる信頼値をディスタンス フィールド テンポラル フィルタに格納することでカメラの移動中のゴーストの発生を抑えやすくなり、 ゴースト問題が改善されました。

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

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

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

DF_ClipMap.png

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

オブジェクトのディスタンス フィールドが低解像度の場合、すべてのものには使用できなくなります。スカイ オクルージョンでコーンのトレースを演算処理する場合、オブジェクトのディスタンス フィールドはシェーディングされているポイント近くでサンプリングされます。 一方、はるかに高速なグローバル ディスタンス フィールドはさらに離れた場所でサンプリングされます。

[Show] > [Visualize] > [Global Distance Fields] を選択し、ディスタンス フィールド アンビエント オクルージョン の Level Viewport ビューモードを使用すれば、グローバル ディスタンス フィールドを視覚化できます。

Object Distance Fields

Global Distance Fields

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

制限事項

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

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

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

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

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

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

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

ヒントとトリック

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

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