メッシュディスタンス フィールド

ゲーム開発でメッシュディスタンス フィールドを使用する方法および機能の概要を説明します。

Windows
MacOS
Linux

Unreal Engine 4 (UE4) では *ディスタンヅ フィールド (Distance Field)** のパワーを利用してゲーム内のスタティックメッシュ アクタにダイナミック アンビエント オクルージョンとシャドウイングを生成することができます。さらに、マテリアル エディタと組み合わせて使用すれば、ダイナミック フロー マップも作成することができます。

それでは UE4 のメッシュ ディスタンス フィールドの仕組み、そしてゲームでの使い方について説明します。

仕組み

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

DistanceField.jpg

SDF の最初のプロパティは光線のトレースに役立ちます。最も近いサーフェスまでの距離が分かっているので、空のスペースに安全にスキップ (Sphere Tracing) できるようになります。結果、少ない手順で交点を定義することができます。ディスタンス フィールドをレイトレーシングすることにより結果が可視化されるため、 光線がメッシュと交わるとライトにシャドウがかかります。

RayTrace.jpg

2 つ目のプロパティは、SDF を使いやすくします。光線のトレース時に、光線が通過した最も近い距離を遮蔽しているオブジェクトでトラックすることで、余分な負荷をかけずにおおよそのコーン交点を取得することができます。ディスタンス フィールドを使って、エリア シャドウおよびスカイ オクルージョンを非常にソフトにする設定が可能になります。このプロパティは、少ないコーン数で受け取り地点の半球全体に対するソフトな可視性を計算することができるので、ディスタンス フィールド アンビエント オクルージョン などの機能で非常に重要です。

ConeTrace.jpg

詳細は、「ライティングでディスタンス フィールドを使用する 」を参照してください。

シーンの表現

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

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

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

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

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

グレイよりも白が多いエリアが表示された場合、メッシュ サーフェスの交差判定に多くのステップが必要となります。サーフェスに対するグレージング角の光線を交差させるには、シンプルなメッシュの作成よりも作業手順が多くなります。

品質

メッシュ ディスタンス フィールドを表現する品質は、ボリューム テクスチャの解像度で調整します。これは、スタティックメッシュ エディタビルド設定 の中にある [Distance Field Resolution Scale] で変更することができます。

BuildSettings.png

大きなメッシュは様々はエラーを起こしやすいため、同じサイズのメッシュでレベルを構成した場合、を表現する品質は、ボリューム テクスチャの解像度で調整します。これは、**スタティックメッシュ エデの品質が最も良くなります。例えば Fortnite では、メッシュをグリッドに合わせるか、またはプロップをレベルの回りに置くことで エラーも少なく、非常にきれいに仕上がりました。ランドスケープは ハイト フィールド で別に処理され、Distance Field の解像度の影響は受けません。

オリジナルのメッシュ

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

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

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

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

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

メッシュ ディスタンス フィールドが生成されると、解像度に応じて角が丸くなります。これは解像度を高くしてオフセットすることができます。ほとんどの場合、メッシュの複雑度によりますが、特に重要ではありません。メッシュ 1 つあたりのボリューム テクスチャの最大サイズは、解像度 128x128x128、8 メガバイトです。

QualityCorners1.png

QualityCorners2.png

QualityCorners4.png

薄いサーフェスの場合は、メッシュの内部に負のテクセルを使用しなければ表現できません。これはルートを探すために必要となります。解像度を高くすると、多くの詳細をより正確にキャプチャすることができますが、[ディスタンス フィールド アンビエント オクルージョン]Engine/Rendering/LightingAndShadows/DistanceFieldAmbientOcclusion) のみを使用するとサーフェスは正しく表示されません。サーフェスから遠いオクルージョンは正確になるので、スカイ オクルージョンでは通常は目立ちません。

QualityCorners3.png

Global Distance Field

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

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

[Show] > [Visualize] > [Global Distance Fields] をクリックすることで、Global Distance Field をビューポートで視覚化できます。 (w:250)

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

以下はオブジェクトごとにメッシュ ディスタンス フィールドで視覚化した場合と、カメラのビューと距離に合わせてそれらをクリップマップで組み合わせたグローバル ディスタンス フィールドで視覚化した場合の比較です。

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

グローバル ディスタンス フィールドの視覚化

Foliage アセット

Foliage アセットはディスタンス フィールドを利用して、動的オクルージョンを与える、またはカスケード シャドウ マップがシャドウをかける以上のディスタンス シャドウイングを可能にします。

ゲームで Foliage アセットを使用する場合、以下のオプションと組み合わせると最高のパフォーマンスと品質を引き出すことができます。

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

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

BuildSettings_TwoSided.png

このサンプルでは、左側の木はデフォルトの不透明なメッシュ ディスタンス フィールドによる表現、そして右側の木は [Two-Sided Distance Field Generation] を有効にしました。両面のメッシュ ディスタンス フィールドは、グレイよりも白が多く、サーフェスが透過していることが分かります。つまり、ボリューム テクスチャの生成時に、不透明な表現にした場合よりも メッシュ交差判定にさらに手間がかかり、負荷も高くなります。

Foliage ツール設定

Foliage ツール では、アンビエント オクルージョンとシャドウイングのために、フォリッジのタイプにディスタンス フィールド ライティング機能を使ってもらいたいならば、そのフォリッジのタイプを有効化しなければなりません。この設定はデフォルトでは無効になっています。草などのフォリッジ アセットの中には、インスタンス数が非常に多いためタイル カリング バッファをオーバーフローしてしまう場合があり、その時に目障りなアーティファクトが発生してしまうからですそのため、必要なフォリッジ アセットに対してのみ [Affect Distance Field Lighting] を有効にします。

FoliageToolSettings.png

ディスタンス フィールドを有効にする

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

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

[Lighting] カテゴリの [Generate Mesh Distance Fields (Mesh Distance Fields を生成する)] の横にあるチェックボックスを切り替えます。

GeneratedMeshDF.png

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

RestartEditorButton.png

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

BuildingMeshDFs.png

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

シーン ビュー

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

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

メモリ使用と最適化

  • r.AOListMeshDistanceFields はメモリサイズでソートされている Mesh Distance Field を出力ログへダンプします。コンテンツの最適化に便利な手法です。

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

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

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

    • Eight Bit Mesh Distance Fields は、Distance Fields ボリュームを 16-bit 浮動小数点ではなく 8-bit 固定小数点形式で保存するかどうかを設定します。メモリは半分しか使用しませんが、大きいメッシュ、または薄いメッシュがあるとアーティファクトが発生します。

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

制限事項

ディスタンス フィールド テクニックに関する制限事項

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

  • 剛体メッシュからシャドウのみキャストします。スケルタルメッシュの場合、ディスタンス フィールド アンビエント オクルージョン (DFAO) およびソフトな直接シャドウィングのある間接光が当たっているエリア カプセル シャドウ を使用します。

  • ワールド ポジション オフセットや変位を使ってメッシュを変形するマテリアルは、アーティファクトが発生します。これは、ディスタンス フィールドによる表現がオフラインで生成されており、このような変形情報がないためです。

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

  • 不均等なスケーリングは正しく処理できません (ミラーリングは問題ありません) 。ただし、2x 以下であればメッシュをスケーリングしても通常は気付きません。

  • Static Mesh コンポーネント、Instanced Static Mesh コンポーネント、フォリッジ、ランドスケープ (ハイトフィールド) のみがサポートされています。フォリッジは、[Foliage Tool Settings] の [Affect Distance Field Lighting] で有効にしなければなりません。

ハードウェアの制約事項

  • HD 4000 は大規模な地図をアロケートするための RHICreateTexture3D call でハングアップするため、すべてのメッシュ ディスタンス フィールド 機能は Intel カード上では無効にされています。

リファレンス

基本

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback