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

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

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

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

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


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

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

[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 の呼び出しでハングアップしてしまうためです。