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

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

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

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

仕組み

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

Example of the storing distance to the nearest surface

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

Example of the sphere tracing principle

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

Example of the tracking the closest distance a ray passed by an occluding object

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

シーンの表現

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

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

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

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

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

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

品質

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

画像をクリックして拡大表示します。

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

オリジナルのメッシュ

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

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

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

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

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

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

Rounded corners based on the resolution 1

Rounded corners based on the resolution 2

Rounded corners based on the resolution 3

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

Thin serfaces representation with Mesh Distance Field visualization

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

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

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

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

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

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

Mesh Distance Fields Visualization

Global Distance Fields Visualization

フォリッジ

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

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

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

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

Enabling the Two-Sided Distance Field

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

Two-Sided Distance Field Generation 無効

Two-Sided Distance Field Generation 有効

画像をクリックして拡大表示します。

フォリッジ ツールの設定

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

画像をクリックして拡大表示します。

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

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

Open Project Settings

[Engine] セクションで [Rendering] を選択します。[Software Ray Tracing] カテゴリで [Generate Mesh Distance Fields] の横にあるチェックボックスを切り替えます。

画像をクリックして拡大表示します。

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

Restart Editor to apply new settings

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

シーンビュー

Mesh Distance Fields Visualization

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

制限事項

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

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

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

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

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

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

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

ハードウェアの制約事項

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

リファレンス

基本情報

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