Unreal Engine は 距離フィールド を活用し、ゲーム内のスタティックメッシュ アクタに動的アンビエント オクルージョンとシャドウイングを生成することができます。さらに、アクタのメッシュ距離フィールドの表現は、GPU パーティクル コリジョンなどの他の機能に使用したり、マテリアル エディタと一緒に使用すればダイナミック フロー マップなども生成できます。
このガイドを読み進めていくことで、メッシュ距離フィールドの機能やゲーム内で使用できるいくつかの方法について学ぶことができます。
仕組みについて
スタティックメッシュのサーフェスを表現するには、符号付き距離フィールド (Signed Distance Field:SDF) を使用します。最も近いサーフェスまでの距離をボリューム テクスチャに格納します。メッシュの外にあるすべてのポイントは正の距離としてみなされ、メッシュ内のポイントは負の距離を格納します。次の例では、後から木を表現するために正の距離がトレースおよび格納されています。

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

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

詳細は、「using Distance Fields for Lighting」 を参照してください。
シーンの表現
作成する各レベルは、設置したアクタに対してこれらすべてのメッシュ距離フィールドで構成されています。メッシュ距離フィールドは、結果をボリューム テクスチャに格納するトライアングルのレイトレーシングを使用して「オフライン」で生成されます。そのため、メッシュ距離フィールドの生成は実行時に行うことができません。このメソッドでは、符号付き距離フィールドの光線をすべての方向で計算し、最も近いサーフェスを探してその情報を格納します。
ビューポートを使用して [Show (表示)] > [Visualize (視覚化)] > [Mesh Distance Fields (メッシュ距離フィールド)] を選択すると、シーンを表現するメッシュ距離フィールドを視覚化することができます。
ビジュアライゼーションを有効にするメニュー | メッシュ距離フィールドのビジュアライゼーション |
画像をクリックすると拡大表示されます。
グレイより白いエリアが多く表示されるときは、メッシュ サーフェスの交点を探すために必要な手順が多数あることを意味します。サーフェスに対するグレージング角の光線は、シンプルなメッシュの場合に比べると交差させるための手順が多く必要になります。
品質
メッシュ距離フィールドが表示される際の品質は、そのボリューム テクスチャの解像度で管理します。解像度は スタティックメッシュ エディタ の [Build Settings (ビルド設定)] にある [Distance Field Resolution Scale (距離フィールド解像度スケール)] を使用して修正します。
画像をクリックすると、拡大表示されます。
大きなメッシュではエラーが発生しやすいため、メッシュ距離フィールドの品質は、同程度のサイズを持つメッシュからビルドされたレベルの場合に最も良くなります。たとえば、フォートナイト のメッシュはグリッドに合わせるか、レベルのパーツの周囲に配置されたプロップのため、エラーが少なく最善の結果となっています。ランドスケープは 高さフィールド によって別途処理され、距離フィールドの解像度による影響は受けません。
オリジナルのメッシュ | 解像度が低すぎると、重要な特性が表現されない | 解像度を上げると、重要な特性が表現される |
画像をクリックすると拡大表示されます。
メッシュ距離フィールドの解像度は、重要な特性をキャプチャできるように調整する必要があります。メッシュの解像度を上げると、メッシュ距離フィールドのメモリ使用量も増加します。スタティックメッシュ エディタでは、メッシュ距離フィールドのサイズがビューポートの左上に表示されます。
画像をクリックすると、拡大表示されます。
メッシュ距離フィールドが生成されると、解像度に応じて角が丸まります。これは解像度を上げるとオフセットできますが、多くの場合、メッシュの複雑度にもよるものの、問題とはなりません。単体のメッシュに設定できるボリューム テクスチャの最大サイズは解像度 128x128x128 の 8 メガバイトです。
![]() |
![]() |
![]() |
---|---|---|
薄いサーフェスの場合は、メッシュ内部に負のテクセルを使用した場合にのみ表現できます。これはルートを探すために必要です。解像度を上げると大きなディテールをより正確にキャプチャできますが、距離フィールド アンビエントオクルージョン のみを使用している場合はサーフェスが正しく表示されません。これは、サーフェスから遠いオクルージョンが正確になるため、Sky オクルージョンではあまり目立ちません。

グローバル距離フィールド
グローバル距離フィールドは、カメラを追いかけながらレベルで符号付き距離フィールド オクルージョンを使用する低解像度の距離フィールドです。オブジェクトごとにメッシュ距離フィールドのキャッシュを作成し、カメラの周囲を中心とするいくつかのクリップマップと呼ばれるボリューム テクスチャにコンポジットします。このときに更新する必要があるのは、新しく見えるようになったエリア、またはシーン変更の影響を受けたエリアのみになるため、コンポジットによる負荷はそれほどかかりません。
オブジェクトの距離フィールドの解像度が低いということは、これをすべてに使用できるということを意味します。ただし、Sky オクルージョンのコーン トレースを計算する場合、オブジェクト距離フィールドはシェーディングされるポイントの近くでサンプリングされます。一方、グローバル距離フィールドは遠くでサンプリングされます。
ビューポートのグローバル距離フィールドは、[Show] > [Visualize] > [Global Distance Fields] をクリックして視覚化することができます。
画像をクリックすると、拡大表示されます。
次の図は、オブジェクトごとのメッシュ距離フィールドのビジュアライゼーションと、カメラ ビューと距離に基づいてクリップマップで組み合わせたグローバル距離フィールドのビジュアライゼーションの比較です。


詳細は、「距離フィールド アンビエント オクルージョン」 ページを参照してください。
フォリッジ
フォリッジ アセットは距離フィールドを利用して、動的オクルージョンを付与する、またはカスケード シャドウ マップがシャドウをかける範囲を超える遠方までシャドウイングすることができます。
ゲームにフォリッジ アセットを使用する場合の最大限のパフォーマンスと品質を得るために考慮すべきオプションの一部を紹介します。
両面ディスタンス フィールド
(木などの) 高密度のメッシュの場合、通常はマスクされたマテリアルで構成されるサーフェスで葉や枝にある多数の穴を表現しますが、これらはソリッドなサーフェスとして適切に表現することができません。それに対応するために、スタティックメッシュ エディタ で [Two-Sided Distance Field Generation] の [Build Setting] を有効にすることができます。これはフォリッジと相性の良いオプションですが、レイ マーチングの負荷が高くなります。

以下の例を見てください。左の木はデフォルトの不透明型メッシュ距離フィールドで表示されています。右の木は [Two-Sided Distance Field Generation] が有効になっています。両面メッシュ距離フィールドはグレイよりも白が多く、サーフェスは透過していることがわかります。これは、ボリューム テクスチャを生成する際に、不透明型と比べてメッシュの交点を探すための手順が増え、負荷がかかることを意味します。
両面距離フィールド生成が無効 | 両面距離フィールド生成が有効 |
画像をクリックすると拡大表示されます。
フォーリッジ ツール設定
フォリッジ ツール では、アンビエント オクルージョンおよびシャドウイングに使用する距離フィールド ライティング機能のフォリッジ タイプをそれぞれ有効にする必要があります。葉などの一部のフォリッジ アセットは、数え切れないほどのインスタンスによりタイル カリング バッファがオーバーフローしてしまうため、デフォルトではこの設定は無効になっています。オーバーフローが発生すると、目障りなアーティファクトが発生します。そのため、必要なフォリッジ アセットに対してのみ [Affect Distance Field Lighting (距離フィールド ライティングに影響を与える)] を有効にします。
画像をクリックすると、拡大表示されます。
距離フィールドを有効にする
プロジェクトのメッシュ ディスタンス フィールドを有効にするには、メイン メニューの [編集] から [Project Settings (プロジェクト設定)] ウィンドウを開きます。

[Engine (エンジン)] セクションに移動し、[Rendering (レンダリング)] を選択します。[Software Ray Tracing (ソフトウェア レイ トレーシング)] カテゴリで、[Generate Mesh Distance Fields (メッシュ距離フィールドの生成)] の横にあるチェックボックスを切り替えます。
画像をクリックすると、拡大表示されます。
これを有効にすると、プロジェクトの再起動を求められます。

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


このレベル全体は、ボリューム テクスチャに保存されているインスタンス化されたディスタンス フィールドによって表されます。
制限事項
距離フィールドの技法に関する制限事項
-
機能レベル 5 のプラットフォームのみサポートします (DX-11 以上)
-
剛体メッシュからはシャドウのみキャストします。スケルタルメッシュの場合、距離フィールド アンビエントオクルージョン (DFAO) およびソフトな直接シャドウイングで間接的にライティングされるエリアには カプセル シャドウ を使用することができます。
-
ワールド位置オフセットや変位を使用してメッシュを変形するマテリアルでは、距離フィールドの表示がオフラインで生成され、それらの変形情報が不明なため、セルフシャドウイング アーティファクトが発生します。
現在の実装に対する制限事項 (今後改善される可能性があります)
-
不均等なスケーリングは正確に処理できません (ただし、ミラーリングは問題ありません)。その場合も、メッシュのスケーリングが 2 倍以下であれば通常は目立ちません。
-
スタティックメッシュ、インスタンス スタティックメッシュ、フォリッジ、およびランドスケープ (高さフィールド) のみがサポートされます。フォリッジは、フォリッジ ツールの設定で [Affect Distance Field Lighting] を有効にしておく必要があります。
ハードウェアの制限事項
- すべてのメッシュ距離フィールド機能は、Intel カード上で無効になっています。これは、HD 4000 が大規模なアトラスを割り当てる RHICreateTexture3D の呼び出しでハングアップしてしまうためです。