メッシュ ディスタンス フィールド (Mesh Distance Fields)

メッシュ ディスタンス フィールドとゲーム開発時に使用できる機能についての概要です。

Choose your operating system:

Windows

macOS

Linux

Unreal Engine 4 (UE4) は ディスタンスフィールド を活用し、ゲーム内のスタティック メッシュ アクタに動的アンビエント オクルージョンとシャドウイングを生成することができます。さらに、アクタのメッシュ ディスタンス フィールドの表現は、GPU パーティクル コリジョンなどの他の機能に使用したり、マテリアル エディタと一緒に使用すればダイナミック フロー マップなども生成できます。

このガイドを読み進めていくことで、UE4 におけるメッシュ ディスタンス フィールドの機能やゲーム内で使用できるいくつかの方法について学ぶことができます。

仕組み

スタティック メッシュのサーフェスを表現するには、 符号付きディスタンス フィールド (Signed Distance Field:SDF) を使用します。最も近いサーフェスまでの距離をボリューム テクスチャに格納します。メッシュの外にあるすべてのポイントは正の距離としてみなされ、メッシュ内のポイントは負の距離を格納します。次の例では、後から木を表現するために正の距離がトレースおよび格納されています。

DistanceField.jpg

SDF の便利な特性の 1 つ目は、光線をトレースする時に、最も近いサーフェスへの距離がすでにわかっているため、空のスペースを安全にスキップできることです (これはスフィア トレーシングとも呼ばれます)。これにより、少ない手順で交点を決定することができます。ディスタンス フィールドをレイ トレーシングすることにより結果が可視化されるため、光線がメッシュと交差するとライトにシャドウがかかります。

RayTrace.jpg

次の便利な特性は、光線をトレースする時に、光線が遮蔽オブジェクトを通過した最短距離を追跡することにより、おおよそのコーン交点を余分な負荷をかけずに計算できることです。この近似交点により、ディスタンス フィールドを使用した非常にソフトなエリア シャドウとスカイ オクルージョンの実現が可能になります。これは、少ないコーン数で受け取り地点の半球全体に対してソフトな可視性を計算することができるため、 ディスタンス フィールド アンビエントオクルージョン のような機能では主要な特性となります。

ConeTrace.jpg

詳細は、『 using Distance Fields for Lighting 』を参照してください。

シーンの表現

作成する各レベルは、設置したアクタに対してこれらすべてのメッシュ ディスタンス フィールドで構成されています。メッシュ ディスタンス フィールドは、結果をボリューム テクスチャに格納するトライアングルのレイトレーシングを使用して「オフライン」で生成されます。そのため、メッシュ ディスタンス フィールドの生成は実行時に行うことができません。このメソッドでは、符号付きディスタンス フィールドの光線をすべての方向で計算し、最も近いサーフェスを探してその情報を格納します。

ビューポートで [Show (表示)] > [Visualize (視覚化)] > [(メッシュ ディスタンス フィールド)] を選択すると、シーンを表現するメッシュ ディスタンス フィールドを視覚化することができます。

視覚化を有効にするメニュー

メッシュ ディスタンス フィールドの視覚化

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

グレイより白いエリアが多く表示される時は、メッシュ サーフェスの交点を探すために必要な手順が多数あることを意味します。サーフェスに対するグレージング角の光線は、シンプルなメッシュの場合に比べると交差させるための手順が多く必要になります。

品質

メッシュ ディスタンス フィールドが表示される際の品質は、そのボリューム テクスチャの解像度で管理します。これは、 スタティックメッシュ エディタ Build Settings (ビルド設定) にある [Distance Field Resolution Scale (ディスタンス フィールド解像度スケール)] で変更することができます。

BuildSettings.png

大きなメッシュではエラーが発生しやすいため、メッシュ ディスタンス フィールドの品質は、同程度のサイズを持つメッシュからビルドされたレベルの場合に最も良くなります。たとえば、 Fortnite のメッシュはグリッドに合わせるか、レベルのパーツの周囲に配置されたプロップのため、エラーが少なく最善の結果となっています。ランドスケープは 高さフィールド によって別途処理され、ディスタンス フィールドの解像度による影響は受けません。

オリジナルのメッシュ

解像度が低すぎると、重要な特性が表現されない。

解像度を上げると、重要な特性が表現される

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

メッシュ ディスタンス フィールドの解像度は、重要な特性をキャプチャできるように調整する必要があります。メッシュの解像度を上げると、メッシュ ディスタンス フィールドのメモリ使用量も増加します。スタティック メッシュ エディタでは、メッシュ ディスタンス フィールドのサイズがビューポートの左上に表示されます。

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

メッシュ ディスタンス フィールドが生成されると、解像度に応じて角が丸まります。これは解像度を上げるとオフセットできますが、多くの場合、メッシュの複雑度にもよるものの、問題とはなりません。単体のメッシュに設定できるボリューム テクスチャの最大サイズは解像度 128x128x128 の 8 メガバイトです。

QualityCorners1.png

QualityCorners2.png

QualityCorners4.png

薄いサーフェスの場合は、メッシュ内部に負のテクセルを使用した場合にのみ表現できます。これはルートを探すために必要です。解像度を上げると大きなディテールをより正確にキャプチャできますが、 ディスタンス フィールド アンビエント オクルージョン のみを使用している場合はサーフェスが正しく表示されません。これは、サーフェスから遠いオクルージョンが正確になるため、Sky オクルージョンではあまり目立ちません。

QualityCorners3.png

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

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

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

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

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

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

Mesh Distance Fields Visualization

Global Distance Fields Visualization

フォリッジ

フォリッジ アセットはディスタンス フィールドを利用して、動的オクルージョンを付与する、またはカスケード シャドウ マップがシャドウをかける範囲を超える遠方までシャドウイングすることができます。

ゲームにフォリッジ アセットを使用する場合の最大限のパフォーマンスと品質を得るために考慮すべきオプションの一部を紹介します。

両面ディスタンス フィールド

(木などの) 高密度のメッシュの場合、通常はマスクされたマテリアルで構成されるサーフェスで葉や枝にある多数の穴を表現しますが、これらはソリッドなサーフェスとして適切に表現することができません。それに対応するために、 スタティックメッシュ エディタ ビルド設定 [Two-Sided Distance Field Generation] を有効にすることができます。これはフォリッジと相性の良いオプションですが、レイ マーチングの負荷が高くなります。

BuildSettings_TwoSided.png

この例では、左の木はデフォルトの不透明型メッシュ ディスタンス フィールドで表示されています。右の木は [Two-Sided Distance Field Generation] が有効になっています。両面メッシュ ディスタンス フィールドはグレイよりも白が多く、サーフェスは透過していることがわかります。これは、ボリューム テクスチャを生成する際に、不透明型と比べてメッシュの交点を探すための手順が増え、負荷がかかることを意味します。

フォリッジ ツールの設定

フォリッジ ツール では、アンビエント オクルージョンおよびシャドウイングに使用するディスタンス フィールド ライティング機能のフォリッジ タイプをそれぞれ有効にする必要があります。葉などの一部のフォリッジ アセットは、数え切れないほどのインスタンスによりタイル カリング バッファがオーバーフローしてしまうため、デフォルトではこの設定は無効になっています。オーバーフローが発生すると、目障りなアーティファクトが発生します。そのため、必要なフォリッジ アセットに対してのみ [Affect Distance Field Lighting (ディスタンス フィールドライティングに影響を与える)] を有効にします。

FoliageToolSettings.png

メッシュ ディスタンス フィールドを有効にする

プロジェクトのメッシュ ディスタンス フィールドを有効にするには、ファイル メニューの [ (編集)] > [Project Settings (プロジェクト設定)] から [Project Settings (プロジェクト設定)] ウィンドウを開き [Rendering] セクションを選択します。

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

[Lighting] カテゴリで [Generate Mesh Distance Fields (メッシュ ディスタンス フィールドの生成)] の横にあるチェックボックスを切り替えます。

GeneratedMeshDF.png

これを有効にすると、プロジェクトの再起動を求められます。

RestartEditorButton.png

次にプロジェクトをロードする時、メッシュ ディスタンス フィールドが生成されていることを示す次のポップアップが画面下の端に表示されます。

BuildingMeshDFs.png

再起動が完了したら、 [Show] > [Visualize] > [Mesh DistanceFields] をクリックすると、メッシュ ディスタンス フィールドをビューポートで視覚化することができます。次のような画面が表示されます。

シーン ビュー

メッシュ ディスタンス フィールドの視覚化

このレベル全体がボリューム テクスチャに格納されているインスタンス化されたディスタンス フィールドによって表現されます。

メモリ使用量と最適化

  • r.AOListMeshDistanceFields は、メモリ サイズでソートされているメッシュ ディスタンス フィールドをアウトプット ログにダンプします。これはコンテンツの最適化に便利な手法です。

  • [Project Settings] > [Rendering] で有効にします。

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

    • [Compress Mesh Distance Fields (メッシュ ディスタンス フィールドの圧縮)] を有効にすると、圧縮されたディスタンス フィールド ボリューム テクスチャをメモリに格納できます。これによりメモリ使用量を削減することができますが、レベル ストリーミングを使用している場合は、これらのレベルがストリーミングされる際にゲームプレイで処理落ちが発生します。

    • [Eight Bit Mesh Distance Fields (8 ビットメッシュ ディスタンス フィールド)] を有効にすると、ディスタンス フィールド ボリューム テクスチャをデフォルトの 16 ビット浮動小数点ではなく 8 ビット固定小数点形式で格納することができます。この設定ではメモリを半分しか使用しませんが、大きなメッシュ、または薄いメッシュがあるとアーティファクトが発生します。

  • グローバル ディスタンス フィールドフィールドでは、[Mobility (可動性)] が [Static (静的)] または [Stationary (固定)] に設定されている場合に静的プリミティブをキャッシュします。グローバル ディスタンス フィールド全体は主に静的キャッシュから派生しているため、移動可能なプリミティブが修正されると、付近の他の移動可能なプリミティブのみがグローバル ディスタンス フィールドへの再合成を必要とします。

制限事項

ディスタンス フィールドの技法に関する制限事項

  • 機能レベル 5 のプラットフォームのみサポートします (DX-11 以上)

  • 剛体メッシュからはシャドウのみキャストします。スケルタル メッシュの場合、ディスタンス フィールド アンビエントオクルージョン (DFAO) およびソフトな直接シャドウイングで間接的にライティングされるエリアには カプセル シャドウ を使用することができます。

  • ワールド位置オフセットや変位を使用してメッシュを変形するマテリアルでは、ディスタンス フィールドの表示がオフラインで生成され、それらの変形情報が不明なため、セルフシャドウイング アーティファクトが発生します。

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

  • 不均等なスケーリングは正確に処理できません (ただし、ミラーリングは問題ありません)。その場合も、メッシュのスケーリングが 2 倍以下であれば通常は目立ちません。

  • スタティック メッシュ、インスタンス スタティック メッシュ、フォリッジ、およびランドスケープ (高さフィールド) のみがサポートされます。フォリッジは、フォリッジ ツールの設定で [Affect Distance Field Lighting] を有効にしておく必要があります。

ハードウェアの制約事項

  • すべてのメッシュ ディスタンス フィールド機能は、Intel カード上で無効になっています。これは、HD 4000 が大規模なアトラスを割り当てる RHICreateTexture3D の呼び出しでハングアップしてしまうためです。

リファレンス

基本情報

[DIR(output:"topiccompact" Parent: BuildingWorlds/LightingAndShadows

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