メッシュ距離フィールド

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

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 (視覚化)] > [(メッシュ距離フィールド)] を選択すると、シーンを表現するメッシュ距離フィールドを視覚化することができます。

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

Mesh Distance Field の視覚化

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

品質

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

BuildSettings.png

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

オリジナルのメッシュ

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

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

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

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

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

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

QualityCorners1.png

QualityCorners2.png

QualityCorners4.png

薄いサーフェスの場合は、メッシュ内部に負のテクセルを使用した場合にのみ表現できます。これはルートを探すために必要です。解像度を上げると大きなディテールをより正確にキャプチャできますが、[距離フィールド アンビエント オクルージョン]Engine/Rendering/LightingAndShadows/DistanceFieldAmbientOcclusion) のみを使用している場合はサーフェスが正しく表示されません。これは、サーフェスから遠いオクルージョンが正確になるため、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] をクリックすると、メッシュ距離フィールドをビューポートで視覚化することができます。次のような画面が表示されます。

Scene View

Mesh Distance Fields Visualization

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

メモリ使用量と最適化

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

リファレンス

基本情報

Select Skin
Light
Dark

新しい Unreal Engine 4 ドキュメントサイトへようこそ!

あなたの声を私たちに伝えるフィードバックシステムを含め、様々な新機能について開発をおこなっています。まだ広く使える状態にはなっていないので、準備ができるまでは、ドキュメントフィードバックフォーラムで、このページについて、もしくは遭遇した問題について教えていただけると助かります。

新しいシステムが稼働した際にお知らせします。

フィードバックを送信