Nanite 仮想化ジオメトリ

Unreal Engine 5 でピクセル スケールのディテールと高いオブジェクト数を実現する仮想化ジオメトリ システムの概要。

Nanite は Unreal Engine 5 の仮想化ジオメトリ システムであり、新しい内部メッシュ フォーマットとレンダリング テクノロジーを活用して、ピクセル スケールのディテールと多数のオブジェクトをレンダリングします。人が知覚できるディテールだけをインテリジェントに処理し、それ以上は行いません。Nanite のデータ形式は高度に圧縮され、きめ細かいストリーミングと自動詳細度 (LOD) をサポートします。

Example Scenes with Nanite

Nanite の利点

  • ジオメトリの複雑さが数桁分増加して、リアルタイムで以前よりも多くの三角形とオブジェクトを処理可能になりました

  • フレーム バジェットが、ポリゴン数、ドローコール、メッシュ メモリ使用の制限を受けなくなりました

  • ZBrush スカルプトやフォトグラメトリ スキャンといったフィルム品質のソース アートを直接インポートすることが可能になりました

  • ディテールを通常のマップ テクスチャにベイクするのではなく、ハイ ポリゴンのディテールを使用します

  • 詳細度 (LOD) が自動的に処理されるため、個々のメッシュの LOD を手動で設定する必要がなくなりました

  • 品質の低下は、特に LOD トランジションでは稀であるか、存在しません

これらの利点は非常に革新的なものですが、実際にはまだいくつかの制限も残っています。たとえば、コンテンツとハードウェアを組み合わせる上で、インスタンス数、メッシュあたりの三角ポリゴン数、マテリアルの複雑さ、出力解像度、およびパフォーマンスを慎重に測定する必要があります。Nanite は比較的新しい技術であり、今後の Unreal Engine のリリースにおいて継続的に機能の拡張およびパフォーマンスの改善が行われる予定です。

Nanite メッシュとスタティックメッシュの違い

Nanite メッシュとは、Nanite が有効なスタティックメッシュを指します。Nanite メッシュは基本的に三角ポリゴンのメッシュであり、データには多くの詳細度 (LOD) と圧縮が適用されています。それに加えて、Nanite ではまったく新しいシステムを使用して、そのデータ形式を非常に効率的な方法でレンダリングします。

Nanite を利用するためにスタティックメッシュで必要なのは、Nanite を有効にすることだけです。Nanite のコンテンツのオーサリングは従来のメッシュと同じですが、Nanite が従来のレンダリングされたジオメトリよりも格段に多くの三角ポリゴンとインスタンスを処理できる点が違います。カメラを十分近づけると、Nanite はインポートされた元のソースの三角ポリゴンを描画します。

Nanite メッシュは、多数の UV と頂点カラーをサポートします。マテリアルはメッシュのセクションに割り当てられ、シェーダーで実行可能なさまざまなシェーディング モデルとダイナミック エフェクトを、それらのマテリアルで使用することができます。他のスタティックメッシュと同じように、マテリアルの割り当てを動的に入れ替えることができ、Nanite はマテリアルをベイク処理するプロセスを必要としません。

Nanite では必須ではありませんが、仮想テクスチャ を使用することを強く推奨します。仮想テクスチャは、Nanite がメッシュ データを使って達成するテクスチャ データと同様の目標を持つ、Unreal Engine のオルソゴナルな機能です。

Nanite での作業はスタティックメッシュのワークフローに似ていますが、まだサポートされていない機能がたくさんあります。詳細については、本ページの「サポートされる機能」セクションを参照してください。

Nanite の動作

Nanite は、メッシュ データの保存とレンダリングに新しいアプローチを使用しながら、既存のエンジン ワークフローに可能な限りシームレスに統合されます。

  • インポート時 — メッシュが解析され、三角ポリゴン グループの階層的なクラスタに分割されます。

  • レンダリング時 — クラスタはカメラ ビューに基づいて変化する詳細度でオンザフライで交換され、同じオブジェクト内の隣接するクラスタにクラックなしで完全に接続されます。データはオンデマンドでストリーミングされるため、目に見えるディテールだけをメモリに保存する必要があります。Nanite は、従来のドローコールを完全にバイパスする独自のレンダリング パスで実行されます。ビジュアライゼーションモードは Naniteパイプラインを検査するために使用することができます

Nanite は、オンディマンドでディスクのメッシュ データを高速ストリーミングする機能に依存しているため、ランタイム ストレージにはソリッド ステート ドライブ (SSD) を推奨します。

Nanite を使用すべきメッシュのタイプ

一般的に Nanite は可能な限り有効にすべきです。スタティックメッシュで Nanite を有効にすると、通常はレンダリングが高速化され、メモリとディスク領域の消費が削減されます。

具体的には、Nanite に特に向いているメッシュには以下のようなものがあります。

  • 画面上に多数または非常に小さなトライアングルが存在するメッシュ

  • シーンで多数のインスタンスを持つメッシュ

  • 他の Nanite ジオメトリの主要なオクルーダとして機能するメッシュ

  • 仮想シャドウ マップ を使ってシャドウをキャストするメッシュ

これらのルールの例外としては、たとえば天球のようなものがあります。天球の三角ポリゴンは画面上で大きく表現され、何もオクルードせず、シーン内に 1 つしかありません。通常、このような例外は稀であり、これらで Nanite を使用することによるパフォーマンスの損失はほとんど最小限に抑えられるため、Nanite が有用なユース ケースにおいては、Nanite を有効にすべきでない状況について過度に懸念する必要はありません。

現在、一部のユース ケースでは Nanite はサポートされていません。詳細については、本ページの「サポートされる機能」セクションを参照してください。

メッシュで Nanite のサポートを有効にする

Nanite は、サポートされているジオメトリで次の方法で有効にできます。

ジオメトリを Nanite に変換するプロセスでは、メッシュごとにある程度の処理時間がかかります。大規模なプロジェクトで多数の Nanite アセットがある場合は、共有派生データ キャッシュ (DDC) の利用が特に有効です。詳細については、「派生データのキャッシュ」ドキュメントを参照してください。

スタティックメッシュをインポートする

Nanite の使用を目的としたメッシュをインポートする場合は、[Build Nanite (Nanite をビルド)] チェックボックスをオンにします。

Nanite FBX Import Options

ライトマス で事前計算されたライティングを使用しない場合は、[Generate Lightmap UVs (ライトマップ UV の作成)] プロパティを無効にすることをお勧めします。

このプロパティを有効にすると、高精細ジオメトリにより、スタティックメッシュ データのインポートと構築にかなりの時間がかかります。また、このプロパティにより、高密度なメッシュ用の膨大な量のデータを含む UV チャンネルがさらに追加されます。プロジェクトでベイク処理したライティングが必要でなければ、このような追加コストを抱える必要はありません。

アセットで Nanite を有効にする

Nanite を有効にしたいコンテンツが既にプロジェクトに取り込まれている場合は、コンテンツ ブラウザを使用してバッチでアセットを有効化する、あるいは、各自でエディタを使用して個々のアセットを有効化するという 2 つのオプションがあります。

メッシュで Nanite をバッチで有効にする

Nanite を有効にしたいスタティックメッシュ アセットのバッチについては、まず コンテンツ ブラウザ を使ってそれらをすべて選択し、右クリック してコンテキスト メニューから [Nanite] > [Enable (有効化)] を選択します。

Enable Nanite on Batches of Asset in the Content Browser

個別のメッシュで Nanite を有効にする

スタティックメッシュや ジオメトリ コレクション (Chaos 物理駆動型の破砕メッシュ) など、Nanite をサポートするメッシュのエディタを開き、[Details (詳細)] パネルを使って Nanite を有効にします。

スタティック メッシュ エディタ内で、[Nanite Settings (Nanite 設定)] セクションにある [Enable Nanite Support (Nanite サポートを有効化)] チェックボックスをオンにします。

Enable Nanite in the Static Mesh Editor

ジオメトリ コレクション エディタ内では、[Nanite] セクションにある [Enable Nanite (Nanite を有効にする)] チェックボックスをオンにします。

Enable Nanite on Geometry Caches

Nanite のサポートされている機能

このセクションでは、Unreal Engine プロジェクトで Nanite を最大限活用する方法と、サポートされる機能とそうでないもの、さらに制限事項について説明します。

ジオメトリ

Nanite は、スタティックメッシュおよび ジオメトリ コレクション で有効にすることができます。

Nanite が有効なメッシュは、次のコンポーネント タイプで使用できます。

  • スタティックメッシュ

  • インスタンス化されたスタティックメッシュ

  • 階層インスタンス化されたスタティックメッシュ

  • ジオメトリ コレクション

  • フォリッジ ペインター

  • ランドスケープ グラス

Nanite による剛体メッシュの変形のサポートは限定的です。Nanite は、動的か静的かにかかわらず、このメッシュの動的な移動、回転、および不均一なスケーリングをサポートします。これは、メッシュ全体に一様に適用される単一の 4x3 マトリックス乗算で表現できるよりも複雑な方法で、Nanite メッシュの任意の位置を移動することを意味します。

変形は、以下で限定されています。

  • (ベータ) マテリアルのワールド位置オフセット

    • オクルージョン カリング クラスタに使用されるバウンディング ボックスでは、変形に基づいてバウンディング ボックスが更新されたり拡張されたりしません。つまり、以前に存在していた場所を覆うようにサーフェスが外側に変位することがあれば、サーフェスは自身をオクルードし、壊れているように表示される可能性があります。

    • フォリッジは穴で満たされていて実質的に自身をオクルードできないため、WPO を使用したフォリッジでは問題が発生しにくくなります。

変形は、以下でサポートされていません。

  • スケルトン アニメーション

  • モーフ ターゲット

  • スプライン メッシュ

Nanite を有効にしたメッシュは現在以下をサポートしていません。

  • インスタンス上の頂点ペイント

    • 特に、エディタのメッシュ ペイント モードを使用する、インスタンスごとのペイント カラーを指しますが、Nanite では元のメッシュの頂点カラーはサポートされます。

シーンに存在可能なインスタンスの最大数は 1600 万インスタンスに固定されています。これには、Nanite の使用が有効になっているものだけでなく、ストリーミングで入力されるすべてのインスタンスが含まれます。ストリーミングで入力されるインスタンスのみが合計にカウントされます。

Nanite が有効になっている場合、頂点ごとの接線はスタティックメッシュから格納されません。代わりに、タンジェント空間がピクセル シェーダーで暗黙的に派生します。データ サイズを小さくするために、接線データは格納されません。このアプローチを使用した際にタンジェント空間に生じる差異により、エッジ部分で不連続性が発生する場合があります。ただし、この特定の問題が深刻になることは確認されておらず、頂点接線は今後のリリースでサポートされる予定です。

マテリアル

Nanite は、ブレンド モードが Opaque (不透明) および Masked (マスク) に設定されているマテリアルをサポートします。サポートされないマテリアル タイプが検出されると、デフォルトのマテリアルが Nanite が有効なメッシュに割り当てられて、アウトプットログ に追加の情報とともに警告が表示されます。

マテリアルの機能に関する追加の注記:

  • Nanite が有効なメッシュは、そのサーフェスに投影されたデカールを受け取る場合がありますが、メッシュ デカール はサポートされません。このメッシュ デカールでは、マテリアルで Translucent (透過) ブレンド モードが使用されている必要があります。

  • [Wireframe (ワイヤーフレーム)] チェックボックスはサポートされていません。

  • Vertex Interpolator ノードと カスタム UV はサポートされていますが、ピクセルあたり 3 回評価されます。

  • Custom 式ノード、またはそれらを使用するすべてのノード (ParallaxOcclusionMapping マテリアル関数など) を Nanite と使うとアーティファクトを発生する場合があります。Nanite はまだ解析派生対応をしていないので、これは想定内です。

レンダリング

次のレンダリング機能は現在サポートされていません。

  • 以下を使用するビュー関連のオブジェクトのフィルタリング:

    • 画面の最小半径

    • 距離カリング

  • フォワード レンダリング *仮想現実のステレオ レンダリング

  • 画面分割

  • マルチサンプル アンチエイリアス (MSAA)

  • ライト チャンネル

  • Nanite メッシュに対するレイトレーシング

    • Nanite が有効なメッシュには、デフォルトでフォールバック メッシュが使用されます。より多くのソース メッシュのトライアングルを使用するには、スタティックメッシュ エディタの [Fallback Relative Error (フォールバック相対誤差)] パラメータの値を小さくします。

    • (実験段階) Nanite メッシュのネイティブのレイトレーシングの初回サポートは、コンソール変数 r.RayTracing.Nanite.Mode 1 を使用することで有効になります。この手法ではディテールがすべて維持されますが、GPU のメモリ使用量がゼロ誤差フォールバック メッシュよりも大幅に少なくなります。

  • 一部のビジュアライゼーション表示モードは、Nanite メッシュの表示をまだサポートしていません。

    スタティックメッシュ エディタで、高精細ジオメトリの表示に一部のビジュアライゼーション モードを使用する際は注意が必要です。法線と UV を表示することで、エディタのパフォーマンスに問題が発生する場合があります。

サポートされるプラットフォーム

Nanite は現在 PlayStation 5、Xbox Series S|X、そしてシェーダー モデル 6 (SM6) を備え、DirectX 12 の最新ドライバーを使用する、次の仕様を満たすグラフィック カードを搭載した PC でサポートされています。

  • NVIDIA: Maxwell 世代以降のカード

  • AMD: GCN 世代以降のカード

  • Windows 10 のすべての新しいバージョン (バージョン 1909.1350 以降) および DirectX 12 Agility SDK をサポートする Windows 11。

    • Windows 10 バージョン 1909 — リビジョン番号は .1350 以降である必要があります。

    • Windows 10 バージョン 2004 および 20H2 — リビジョン番号は .789 以降である必要があります。

    • DirectX 12 (Shader Model 6.6 atomics) または Vulkan (VK_KHR_shader_atomic_int64)

  • 最新のグラフィック ドライバ

PlayStation 4 と Xbox One でも Nanite はサポートされますが、これらのプラットフォームに対するサポートは現在実験段階にあります。これらのプラットフォーム上における忠実性の高いコンテンツでの Nanite のパフォーマンスは、シッピング用ゲームの要件を満たさない可能性があることが予想されます。

Nanite のフォールバック メッシュと精度の設定

スタティックメッシュには、Nanite の表現の精度を制御する追加のプロパティと、完全に詳細なメッシュから生成されたフォールバック メッシュが含まれます。

これらの設定は、スタティック メッシュ エディタの [Details] にある [Nanite Settings] セクションにあります。

Static Mesh Editor Nanite Settings

[Nanite Settings] には次のプロパティが含まれます。

プロパティ

説明

Enable Nanite Support

このメッシュが Nanite で使用されるのを有効にし、Nanite を使用できない状況ではフォールバック メッシュを生成できるようにします。

Preserve Area

簡素化によってサーフェス領域が失われる Nanite メッシュで、開放境界エッジを拡張し、失われた領域を残りのトライアングルに再分配できるようにします。これは、簡素化によって葉が離れたトライアングルやクワッドになりがちなフォリッジを対象とする場合に最も役立ちます。この設定には、それぞれの葉がスケール アップされる効果があります。草の葉など、ジオメトリ リボンの場合は、厚みが増すという効果があります。この設定は、すべてのフォリッジのメッシュで有効にし、それ以外では有効にしないでください。

Position Precision

Nanite メッシュの生成時にメッシュで使用する精度を選択します。[Auto (自動)] に設定すると、メッシュのサイズに基づいて適切な精度が選択されます。精度は、精度の向上やディスク容量の最適化のためにオーバーライドすることができます。

Minimum Residency

メッシュで常にメモリ内に維持するメモリ バイト サイズを設定します。残りはストリーミングされます。これを高く設定するとより多くのメモリが必要になりますが、一部のメッシュではストリーミングが頻発する問題が軽減されます。

Keep Triangle Percent

ソース メッシュから維持する三角ポリゴンの比率です。ディスク容量を最適化するにはこの比率を下げます。

Trim Relative Error

Nanite メッシュからの削除が可能な相対誤差の最大値を設定します。この相対誤差の値よりもビジュアル面の影響が少ないソース メッシュのすべての詳細が削除されます。相対誤差に単位サイズはありません。また、相対誤差はメッシュのサイズを基準としています。Nanite は、デフォルトで元のソース メッシュの三角ポリゴンをすべて格納します。

Fallback Triangle Percent

Nanite のソース メッシュを削減する際に維持する三角ポリゴン比率を設定します。Nanite のレンダリングをサポートしないプラットフォームなどで完全に詳細な Nanite データを使用できない場合や、複雑なコリジョンでの使用など、Nanite データの使用が実用的でない場合に、これが粗い表現 (またはフォールバック メッシュ) となります。

Fallback Relative Error

フォールバック メッシュからの削除が可能な相対誤差の最大値を設定します。この相対誤差の値よりもビジュアル面の影響が少ない生成済みのフォールバック メッシュのすべての詳細が削除されます。相対誤差に単位サイズはありません。また、相対誤差はメッシュのサイズを基準としています。

Source Import Filename

Nanite で使用する 高解像度 メッシュをインポートするために使用されたファイル パス。より詳細なジオメトリの恩恵を受けることのできるシステム (Unreal Engine の Nanite やジオメトリ モデリングなど) によって LOD0 の代わりに高解像度バージョンのメッシュが使用されます。

頂点精度

Nanite は、メッシュの頂点の位置を量子化してメモリ密度を最大化し、ディスク容量を最小限に抑えます。量子化ステップ サイズは 2 の累乗であり、Position Precision (位置精度) プロパティを使用して、個々のメッシュの要件に合うように選択することができます。デフォルトの [Auto (自動)] では、メッシュのサイズとその三角ポリゴン密度に基づいて適切な精度が選択されます。精度の向上やディスク容量の最適化のために、手動で精度サイズを選択してオーバーライドできます。

Static Mesh Editor Nanite Settings for Position Precision

量子化は、非可逆圧縮の過程で多少の損失が発生します。非可逆圧縮は、モジューラー メッシュ要素または境界を共有するメッシュで作業する場合に特に問題になります。ジオメトリに穴や亀裂を起こさないように境界を完全に整列させる場合は特にそうです。

一貫性を維持するために、量子化は、メッシュ原点を中心に正規化されていないオブジェクトの座標で行われます。これにより、メッシュで同じ精度設定を使用している場合は量子化によってクラックが発生せず、メッシュの中心間の変換がその精度の倍数になることが保証されます。

データのトリミング

ディスク容量を最適化するために、Nanite が格納するデータ量を削減しなければならない場合があります。Nanite には、プロダクション過程のあらゆる段階で、格納された Nanite メッシュから詳細データをトリミングできる設定が含まれているため、最初に品質を高く設定して、後に状況に応じて調整することができます。

詳細データをトリミングするには、Keep Triangle Percent (三角ポリゴン比率を維持) プロパティと Trim Relative Error (相対誤差をトリミング) プロパティを使用します。これらは、Nanite メッシュとして格納される前のデシメーション オプションと捉えることができます。Nanite の場合、詳細をメッシュ全体で均一にする必要はありません。これによって最も関連性の少ないデータが最初に削除され、非可逆圧縮により近づきます。

ソース メッシュから維持する三角ポリゴンの比率を設定するには、Keep Triangle Percent プロパティを使用します。

ソース メッシュからデータをトリミングする際に許可する相対誤差の最大値を設定するには、Trim Relative Error プロパティを使用します。削除した際にこの値よりも少ない相対誤差が生じる三角ポリゴンがすべて削除されます。つまり、ビジュアル面の影響がこの値よりも少ないすべての詳細がトリミングされます。相対誤差に単位サイズはありません。また、相対誤差はメッシュのサイズを基準としています。

これら両方のプロパティはデフォルトで何もトリミングしないように設定されており、Nanite によって元のソース メッシュの三角ポリゴンがすべて格納されます。

データのトリミングはディスク容量 (ダウンロード サイズ) の削減には重要ですが、パフォーマンスの向上には影響しません。詳細については、後述の「データ サイズ」セクションを参照してください。

フォールバック メッシュ

Unreal Engine の多くの機能は、従来のメッシュ レンダリングで提供される頂点バッファにアクセスする必要があります。スタティックメッシュで Nanite を有効にすると、Nanite データを使用できない場合にアクセスして使用できる、高精細メッシュの粗い表現 (フォールバック メッシュ と呼ばれる) が生成されます。Nanite のレンダリングがサポートされない場合に使用するために生成されるのがフォールバック メッシュです。また、フォールバック メッシュは、複雑なコリジョンが必要な場合や、ベイク処理されたライティングにライトマップを使用する必要がある場合、さらには Lumen を使ったハードウェア レイトレーシング反射に必要な場合など、完全に詳細なメッシュの使用が適していない状況でも使用されます。

Fallback Triangle Percent (フォールバックの三角ポリゴン比率) プロパティは、このフォールバック メッシュを生成するために使用される元のソース メッシュからの三角ポリゴン比率を表します。三角ポリゴン比率は 0 ~ 100% の値に設定でき、比率が高いとメッシュの詳細がより多く維持されます。

Fallback Relative Error (フォールバックの相対誤差) プロパティでは、ソース メッシュから詳細を削除する際に許可する相対誤差の最大値を設定します。削除した際にこの値よりも少ない相対誤差が生じる三角ポリゴンがすべて削除されます。その際は、ビジュアル面の影響が少ない詳細が最初に削除されます。相対誤差に単位サイズはありません。また、相対誤差はメッシュのサイズを基準としています。

たとえば、メッシュに対してデシメーションを行いたくない場合は、Fallback Triangle Percentage プロパティを「100」に、Fallback Relative Error プロパティを「0」に設定します。

次の比較画像では、元のソース メッシュから作成した高精細の Nanite メッシュと、生成された Nanite フォールバック メッシュのデフォルト設定を比べています。

ハイポリの Nanite メッシュ

Nanite 生成のフォールバック メッシュ | デフォルト設定

元のソース メッシュから元の詳細をどれだけ維持するかを Fallback Relative Error プロパティで指定し、その詳細をどれだけ使用するかを Fallback Triangle Percentage プロパティで設定します。

次の比較画像では、フォールバック メッシュで Fallback Triangle Percent が 100% に維持されていますが、元のソース メッシュからの三角ポリゴンをより多く使用するために Fallback Relative Error が調整されています。これらの値を調整する場合に、Nanite 三角ポリゴンの Nanite 詳細をそれらの値を変更する際のインジケーターとしてビューポート内で使用できます。

Nanite 生成のフォールバック メッシュ | デフォルト設定

Nanite 生成のフォールバック メッシュ | 品質のために調整された設定

フォールバック メッシュのビジュアライゼーション

スタティック メッシュ エディタでは、完全な詳細の Nanite メッシュと Nanite フォールバック メッシュを、ビューポートの [Show (表示)] メニューにある [Nanite Fallback (Nanite フォールバック)] オプションを使って切り替えることができます。また、Ctrl + N ホット キーを使って 2 つのビジュアライゼーション モード間を切り替えることもできます。

Static Mesh Editor Nanite Fallback Mesh Toggle

Nanite が有効なメッシュにカスタム フォールバック メッシュ LOD を使用する

フォールバック メッシュは、複雑なポリゴンごとのコリジョン、レイトレーシング、ライトのベイク処理などのエンジン機能に使用されます。また、Nanite をサポートしないプラットフォームにも使用されます。フォールバック メッシュの生成時には、Nanite が有効なメッシュでは、常にソース メッシュの LOD0 スロットを使用してフォールバック メッシュを自動生成します。ただし、自動生成されたものではなく、手動で指定されたフォールバック メッシュ、または一連の従来の LOD を使用することが望ましい場合もあります。

このようなレベルで制御が可能なことで、Nanite をプロジェクトだけでなく、レイトレースされた反射に見られるジオメトリを直接制御する手段として、または Nanite をサポートしないプラットフォームに対して使用できます。

独自のカスタム フォールバック メッシュを指定したり、一連の LOD を使用したりするには、次の手順に従います。

  1. [Fallback Triangle Percent] を「0」に設定して、フォールバック メッシュを可能な限り小さくします。このアプローチを使用する場合、これが無視されるためです。

  2. この 従来の LOD 設定 方法を使って、メッシュに 1 つ以上の LOD を追加します。

  3. [LOD Settings (LOD 設定)] セクションで、[LOD Import (LOD インポート)] ドロップダウンを [Import LOD Level 1 (LOD レベル 1 のインポート)] に設定します。

  4. [LOD Settings] セクションの [Minimum LOD (最小 LOD)] を「1」に設定します。これにより、Nanite 生成のフォールバック メッシュが無視されます。

複雑なコリジョンは特殊なケースとして扱われます。コリジョンに使用する LOD を指定するには、[General Settings (一般設定)][LOD for Collision (コリジョン用の LOD)] を使用します。コリジョンには、LOD0 を含むあらゆる LOD を使用できます。

この特定のアプローチでは、Nanite プロジェクトに Nanite をサポートしないプラットフォームとの互換性を自動的に持たせることは不可能な場合があるため、プロジェクトでテストして評価する必要があります。

Nanite は大量のインスタンスを効率的に処理しますが、Nanite が無効な場合は、従来のレンダリング パイプラインのドローコール数が膨大になる可能性があります。この可能性についてプロジェクトでテストする際は、r.Nanite 0 を使って Nanite サポートのオン/オフを切り替えることができます。

詳細については、本ページの「コンソール変数とコマンド」セクションを参照してください。

Nanite が有効なコンテンツで作業する

ほとんどの場合、Nanite は画面の解像度で非常にうまくスケーリングされます。これは、非常にきめ細かい詳細度 (LOD) とオクルージョン カリングという 2 つの機能により実現するものです。通常、これは、シーン内のソース データの幾何学的な複雑さに関係なく、Nanite が画面に描画しようとする三角ポリゴンの数は一定で、ピクセル数に比例することを意味します。

Nanite のデザイン哲学は、ピクセル数よりも多い数の三角ポリゴンを描画することは無駄であるというものです。

Nanite が使用するスケーリング技法が機能しないコンテンツもありますが、これは、Nanite をこのようなコンテンツに使用すべきではないことや、従来のパイプラインよりも高速にレンダリングされないことを意味するわけではなく、このようなタイプのコンテンツには、シーンの複雑さに基づくスケーリングではなく、ピクセルに基づくスケーリングが適用されないことを意味します。このような状況の発生を監視するには、Unreal Engine の プロファイリング 機能を使用してください。

集合ジオメトリ

集合ジオメトリとは、髪の毛、葉、草など、結合されていない多くの小さなオブジェクトが離れた場所では 1 つのボリュームにマージされるジオメトリを指します。このようなタイプのジオメトリでは、Nanite の LOD とオクルージョン カリングが機能しません。Nanite 自体が HLOD 構造であり、小さな三角ポリゴンを大きな三角ポリゴンに簡素化する機能に依存し、違いが小さくて認識できない場合はより粗いものを選択します。連続したサーフェス上では非常にうまく機能しますが、離れたところから見ると、ソリッド サーフェスと言うよりも部分的に不透明な雲のように見える集合ジオメトリではうまくいきません。したがって、Nanite では、集合ジオメトリを典型的なソリッド サーフェスと同じように積極的に削減できないと判断する可能性が高く、その結果、対象となる同じピクセル数に対してより多くの三角ポリゴンが描画されます。

集合ジオメトリで機能しない別の最適化手法として、オクルージョン カリングがあります。オクルージョン カリングは非常にきめ細かいものですが、その粒度はピクセル レベルに達していません。多数の穴を含むジオメトリ (さらに悪いことに、多数の穴を含むジオメトリのレイヤーのレイヤーなど) は、画面上のその領域によって背後にあるオブジェクトがブロックされる前に多くの深度レイヤーを構築する必要があるため、過度なオーバードローを引き起こします。たとえば、画面上に 8x8 ピクセルの領域があり、各ピクセルを塗りつぶすために複数の深度レイヤーを描画する必要があると考えることができます。この過度なオーバードローは、Nanite が同じサイズのピクセル領域に対してより多くの三角ポリゴンを描画しようとすることを意味し、レンダリング速度が低下します。

オクルージョン カリングの問題を引き起こすものの例としてはフォリッジが最もわかりやすいですが、フォリッジ系のメッシュに Nanite を使用してはいけないという意味ではありません。詳細については、以下の「Nanite を使用するフォリッジ」セクションを参照してください。さまざまなユース ケースを試し、プロジェクトに適した使用方法を確認してください。プロファイリング ツールを活用することで、これらのタイプのメッシュに対して Nanite を使用することのパフォーマンスを確認できます。

密に積み上げられたサーフェス

実際に使用する上でのさまざまな制限により、従来のメッシュのオクルージョン カリングでは、大規模なモデル構築 (キットバッシング) ワークフローを実装することはほとんど不可能です。Nanite のきめの細かいオクルージョン カリングの性質により、開発時にこのようなワークフローを使用する際の懸念を軽減できます。先述の「集合ジオメトリ」セクションで説明したように、オーバードローが発生する原因として、可視サーフェスがその下の隠れたサーフェスと非常に近いことが挙げられます。特定のジオメトリが可視サーフェスの下に適切に隠されている場合、それを検出してカリングするための Nanite のコストは非常に低く、オーバーヘッドも存在しないものと考えることができます。しかしながら、最も上のサーフェス付近でいくつかのジオメトリが互いに積み重なっている場合、Nanite ではどちらが上か下かを判断することができず、両方のジオメトリが同時に描画される原因となります。

カリングに関するこの特定の問題は、Nanite がどのサーフェスが最上層であるかを認識せず、すべてのレイヤーが描画されるという最悪なシナリオとなります。このような精度の誤差は、画面のサイズと距離によって異なるため、10 センチ メートル離れた場所ではレイヤーが分離され、サーフェス付近ではきれいに見えますが、距離が離れると距離の差が 1 ピクセルよりも小さくなり、オーバードローになります。

ゲーム ビュー

Naniteインスタンスが密集

次の例では、キャラクターが立っている場所を見下ろすようにカメラが移動した際に、Nanite の オーバードロー ビジュアライゼーションによって、これらの積み重ねられたサーフェスがどのようにレンダリングされるかが示されます。明るい領域は、他の領域よりも多くのオーバードローが生じていることを示しています。

Nanite Overdraw Visualization

このオーバードロー ビジュアライゼーションは、オーバードローの問題を検出するための最良の方法です。ある程度のオーバードローが予想されますが、その量が多すぎると、Nanite のカリングとラスタライズのコストが高くなり、シーンの複雑さにかかわらず、プロセスにおける Nanite のスケーリングの効果が低下します。

ファセット法線とハードエッジ法線

留意すべき問題として、ファセット法線を含む高精細のメッシュをインポートする際には、2 つのポリゴン間にある法線が平滑化されていないという点があります。これは一般的な問題ですが見落としやすく、メッシュで少量の頂点を共有すると、レンダリング パフォーマンスとデータ サイズの両方のコストが大幅に高くなるため、この特定の問題に注意する必要があります。メッシュの頂点の数を、それに含まれる三角ポリゴンの数よりも少なくすることが理想的です。この比率が 2:1 以上の場合、特に結果として三角ポリゴンの数が多くなる場合は、問題が発生する可能性が高くなります。比率が 3:1 になるとメッシュは完全にファセットとなります。この場合、各三角ポリゴンには 3 つの個別の頂点が含まれますが、どの頂点も他の三角ポリゴンとは共有されません。ほとんどの場合、法線が平滑化されないため、これらが同じにならないことが原因です。

これを念頭に、より多くの頂点によって格納するデータが増えることに留意してください。また、これはより多くの頂点変換作業を意味し、2:1 よりも高い比率では遅いレンダリング パスになります。ハード サーフェス モデリングでの意図的な使用には問題はなく、使用しない理由もありません。ただし、100% ファセットの密集したメッシュは、予想よりもはるかにコストが高くなります。また、別の注意点として、他の DCC パッケージで生成された密度の高い有機タイプのサーフェス上にインポートされた法線は、低いポリゴン メッシュで認識される可能性のあるハード法線しきい値を備えていますが、これによって Nanite で不要なコストが発生する可能性があります。

たとえば、下の 2 つのメッシュでは、左のものにはファセット法線があり、右のものには平滑化された法線があります。Nanite の トライアングル ビジュアライゼーションを使ってこれらを比較すると、Nanite によって描画に使用される三角ポリゴンの数に大きな違いがあることがわかります。左のファセット法線には、右の平滑化された法線よりもはるかに多い数の三角ポリゴンが描画されています。

ファセット法線を含む Nanite 有効なメッシュ (左) と、平滑化された法線を含む Nanite 有効なメッシュ (右)

ファセット法線を含む Nanite 有効なメッシュの Nanite トライアングル ビジュアライゼーション (左) と、平滑化された法線を含む Nanite 有効なメッシュの Nanite トライアングル ビジュアライゼーション (右)

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

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

Nanite を使用するフォリッジ

Nanite を使用するフォリッジは、ベータとしてみなされており、積極的な研究および開発を行っています。このセクションでは、Unreal Engine 5.1 の Nanite でフォリッジを活用するためのいくつかのガイダンスを提供します。

デフォルトの Nanite 設定を使用した木々などのアセットでは、林冠が距離とともに薄くなって見える場合があります。こうしたケースは、集合ジオメトリ に特有の形式であり、切り離されたそれぞれの部分 (葉や草) で境界が開放エッジになっています。Nanite が有効な場合にこのように薄くなるのを防ぐには、[Preserve Area (エリアを保持)] の有効化が役立ちます。三角ポリゴンを減らすことで Nanite によって遠方のジオメトリが簡素化される場合、最終的にはこれらの切り離された要素のいくつかを完全に削除する必要があります。Nanite の詳細な情報がない場合、大きなサーフェス領域の損失があるため、結果として薄くなって見えます。[Preserve Area (エリアを保持)] は、開放境界エッジを拡張し、その失われた領域を残りのトライアングルに再分配できるようにします。葉などの対称的な形状を拡張すると、スケール アップと同じ効果があります。草の葉など、非対称のリボンの場合は、厚みが増すという効果があります。

[Preserve Area] はすべてのフォリッジ メッシュに推奨されるものですが、フォリッジではないメッシュには推奨されません。

Preserve Area が無効

Preserve Area が有効

Nanite クラスタ ビジュアライゼーションでは、失われた領域が [Preserve Area] によって再分配される方法をよりわかりやすく確認できます。

Nanite クラスタ ビジュアライゼーション | Preserve Area が無効

Nanite クラスタ ビジュアライゼーション | Preserve Area が有効

Nanite での使用を想定し、フォリッジ アセットを使用およびオーサリングする場合の推奨事項を以下に説明します。これは、現在も実験中の取り組みであり、最適なアプローチを調査しています。ここまでで、Nanite を使用するフォリッジは以前とは異なる方法でオーサリングしなければならないことを確認しましたが、その強みを活用すると、Nanite を利用してより高速かつ高品質な結果を得ることができます。

  • [Preserve Area] (スタティックメッシュ エディタで有効にする) を使用します。

  • マスク付カードではなく、ジオメトリを使用します。

    • マスク付マテリアルは、不透明型マテリアルと比べて負荷がかなり大きくなります。これらをまったく使用しないようにすると、最も高速な結果が得やすくなります。

    • Nanite を使用した従来のカード アプローチ (多数の要素が単一のカードで表現される) は、Nanite を使用しない場合よりも低速になる場合があります。カードベースのフォリッジで Nanite を有効にすることが、常にパフォーマンス改善になると期待しないでください。

    • マスクされたピクセルの負荷は、描画されるピクセル数のものとほぼ同等になります。オーバードローは、Nanite の集合体においてすでに問題となっています。マスクされたマテリアルが使用されている場合、Nanite のオーバードロー ビジュアライゼーションに負荷に関する全体的な内容が示されることはありません。この場合、オーバードローは複雑な概念であり、ビジュアライゼーションに示されるのはその特定の側面のみです。

    • ジオメトリ フォリッジは、カード アプローチ (Nanite を使用したカードと Nanite を使用しないカードの両方) よりも、Nanite を使用するとより高速になることが判明しています。また、表示も向上します。

    • Unreal Engine マーケットプレイスの Megascans: 草 パックには、テストのための優れた例が用意されています。このパックには、マスクされたジオメトリと高ポリゴンのジオメトリが用意されており、各要素は独立していて、マスクされた低ポリゴンのカード (多くの要素が単一のカードで表現される) になっています。

  • ワールド位置オフセット (WPO) を使用すると、より多くの頂点の負荷が高くなります。WPO ロジックは制限し、監視する必要があります。

  • このページの「集合ジオメトリ」セクションで説明した問題は、引き続き該当します。密度が高い森 (上の例のようなもの) では、すべてのメッシュを同じ三角ポリゴン数のソリッド形状で置き換えた同じシーンよりもレンダリングがはるかに低速になります。

Max World Position Offset Displacement を Nanite で使用する

マテリアルとマテリアル インスタンスでは、Max World Position Offset Displacement 設定を使用して、WPO がもちうるオフセット量の上限を設定することができます。この設定は、Nanite メッシュが小さなクラスタに分割されて、そのクラスタが個々の境界をもち、GPU 上で個別にカリングされるので Nanite メッシュには特に便利です。

Max World Position Offset Displacement 設定は、マテリアルの [Details] > [World Position Offset] カテゴリ、またはマテリアル インスタンスの [Material Property Overrides] の中にあります。

Max World Position Offset Displacement setting

詳細については、「マテリアル プロパティ」を参照してください。

Nanite スタテック ディスプレイスメント マッピング

これは実験的機能です。

スタティックメッシュ エディタには、オフラインのアダプティブ テッセレータによって Nanite を有効にしたメッシュにディテールを追加するオプションがあります。テッセレータはディスプレイスメント マップをベイクすることで最適化された Nanite メッシュを生成します。テクスチャ主導型のこのアプローチは非破壊的であり、テッセレーションや変位の量をスカラー パラメータで制御することができます。

Examples with and without Nanite Static Displacement mapping

[Details] パネルの [Nanite Setting (Nanite 設定)] で以下の操作を行います。

  1. [Trim Relative Error (Trim Relative Error)] を 0 以外の値に設定して、テッセレーション量を制御します。

    • デフォルトは 0.04 が適切ですが、0.02 より上に保つ必要があります。これは、メッシュにテッセレーションを行う時のエラーレベルの目標値です。値が低すぎると、単純に三角ポリゴンを多数使用することになり、ビルド時間が長くなります。

  2. [Displacement Maps (ディスプレイスメントマップ)] を追加します。

  3. [Index] 要素を展開し、ディスプレイスメントに使用する Texture を追加します。

    • メッシュに複数のマテリアル スロットがある場合、それぞれのディスプレイスメント マップ インデックスは対応するマテリアル スロットにマッピングされます。たとえば、マテリアル スロット 0 は Displacement Maps Index 0、マテリアル スロット 1 は Index 1 というようにマップします。

  4. Magnitude を設定してディスプレイスメント量を制御します。

  5. [Apply Changes (変更を適用)] をクリックします。

Nanite 以外のコンテンツと Nanite コンテンツのハイブリッド ワークフロー

次のセクションでは、Nanite を有効にしたプロジェクトで Nanite 以外の機能やプラットフォームもサポートする必要がある場合に、アセットを複製することなく利用できるワークフローを取り上げます。

Nanite 用に高解像度メッシュをインポートする

コンテンツ ブラウザ または スタティックメッシュ エディタ を使用して高解像度メッシュをインポートし、既存の Nanite 以外のスタティックメッシュを対象として Nanite 表現にすることができます。

コンテンツ ブラウザ から、スタティックメッシュ アセットで右クリックのコンテキスト メニューを使用し、[Level of Detail (詳細度)] > [High Res (高解像度)] > [Import High Res (高解像度をインポート)] を選択し、インポートするファイルに移動します。

Content Browser right-click import high resolution level of detail option for assets.

または、スタティックメッシュ エディタ を使用し、[Details] パネルの [Nanite] 設定から高解像度メッシュをインポートします。[Import (インポート)] をクリックし、インポートするファイルに移動します。

Static Mesh Editor Nanite import high resolution mesh options.

このワークフローを使用すると、インポート プロセスで Nanite ジオメトリからフォールバック メッシュが自動的に生成されるのではなく、既存のスタティックメッシュと詳細度 (LOD) チェーンが フォールバック メッシュ になります。

このワークフローは、シーン内のスタティックメッシュ アクタで [Disallow Nanite (Nanite を禁止)] 設定を優先します。また、その詳細については、以下の「スタティックメッシュ コンポーネント オプション」セクションで説明しています。

マテリアル ワークフロー

マテリアルを使用する、Nanite 以外のワークフローと Nanite のワークフローを改善できる方法は 2 つあります。マテリアル グラフ内のノードを使用してロジック パスを分割する方法か、または Nanite を使用したレンダリングのみにオーバーライド マテリアルを使用する方法です。

Nanite Pass Switch ノード

Nanite Pass Switch ノードを使用すると、Nanite でレンダリングを行う場合に、マテリアル グラフ内の特殊な動作を定義できます。

Nanite Pass Switch Material Node

Nanite を使用しないパスにレンダリングを行う場合は、デフォルト の入力を使用し、通常どおりにマテリアルが処理されるようにします。Nanite の入力は、簡素化するマテリアル ロジックまたは Nanite パスに対して特殊なレンダリングを行うマテリアル ロジックに使用します。たとえば、Nanite によってサポートされない機能がマテリアルで使用されている場合、同じロジックをデフォルトの入力では維持し、Nanite の入力ではより適合するロジックを使用できます。

Nanite Override Material

マテリアルとマテリアル インスタンスに「Nanite Override Material」スロットが追加されています。オーバーライド マテリアルを設定した場合、マテリアルまたはマテリアル インスタンスが割り当てられた Nanite が有効なメッシュは、参照されている Nanite オーバーライド マテリアルを代わりに使用します。これはつまり、Nanite Pass Switch ノードを使用してマテリアル グラフ内から直接ロジックを管理するのではなく、Nanite ワークフローに特定のマテリアルを作成できるということです。

Nanite Override Material Slot in a Material Instance.

このマテリアル インスタンスでは、Nanite Override Material スロットが強制的にデフォルトで None になるため、親マテリアルでのオーバーライドが設定されていても、そのマテリアルの子インスタンスに自動的に継承されることはありません。

以下の例では、像のスタティックメッシュ アセットで Nanite が有効になっており、マテリアル インスタンスが適用されています。マテリアル インスタンスには、デモンストレーションを目的としていくつかの単純な色の変化を伴う Nanite Override Material が設定されています。メッシュは Nanite でレンダリングされるため、左側のスタティックメッシュ アクタには、Nanite Override Material が表示されています。[Disallow Nanite] がアクタに設定されていない限り、右側のスタティックメッシュ アクタには同じマテリアルが表示され、Nanite Override Material ではマテリアル インスタンスの Nanite を使用しないベース マテリアルの表示が無効になります。

スタティックメッシュ コンポーネント オプション:Disallow Nanite

Nanite が有効なスタティックメッシュで Nanite 表現を使用する必要がある場合には、[Disallow Nanite] 設定を使用して、個々のシーンのアクタに設定を行うことができます。これはつまり、同じスタティックメッシュ アセットを使用する Nanite のアクタと Nanite でないアクタを混在させて使用できるということになります。

Static Mesh Component setting for Disallow Nanite.

以下の例では、単一の Nanite が有効なスタティックメッシュ アセットを示します。ここで、左側は Nanite のメッシュ表現であり、右側は [Disallow Nanite] を有効にしたものです。

Example visualization with a Nanite-enabled and Disallowed Nanite Mesh

ランドスケープ テレイン

これは実験的な機能です。

ランドスケープ テレインで Nanite を使用する場合は、ランドスケープ テレインを選択し、[Details] パネルを使用して [Enable Nanite (Nanite を有効化)] の横にあるボックスにチェックを入れます。

Landscape property to enable Nanite.

ランドスケープ データから Nanite メッシュ表現を作成するには、次の 2 つの方法があります。

  • ランドスケープの [Details] パネルの [Nanite] セクションで、[Rebuild Data (データをリビルド)] ボタンをクリックします。

  • [Build (ビルド)] メニューを使用し、[Build Nanite Only (Nanite のみをビルド)] を選択します。

ランドスケープのサイズやタイルの数によって、Nanite 表現の生成には時間がかかる場合があります。完了すると、Nanite ビジュアライゼーション モードで確認できます。

Nanite visualizations of a Landscape enabled as a Nanite mesh.

Nanite が有効なランドスケープで作業する場合、次のコンソール変数が役立つことがあります。

  • Landscape.LiveRebuildNaniteOnModification は、変更が行われた場合に Nanite 表現のリビルドを即座にトリガーします (デフォルトは「0」)。

  • Landscape.RenderNanite は、ランドスケープのレンダリングに Nanite を使用するかしないかを設定します (デフォルトは「1」)。

Nanite が有効なランドスケープには、次の制限があります。

  • Nanite が有効なランドスケープでライブでの変更を利用する (Landscape.LiveRebuiltNaniteOnModification 1) と、フレームごとにすべてのランドスケープ アクタの Nanite 表現がリビルドされるため、ランドスケープのスカルプティングはほぼ利用できなくなります。

  • Nanite メッシュの最大解像度は、ランドスケープの LOD0 と同じです。通常のランドスケープで Nanite を使用することによる解像度の増加は想定されていません。現在の状態では、これは純粋なランタイム時の最適化によるものです。

  • Nanite を有効にしたランドスケープ アクタを保存する際に Nanite メッシュが更新されていないと、保存前に Nanite メッシュをビルドする必要があるため、低速になります。

技術的な考慮事項

  • Nanite のランドスケープは現在、通常のランドスケープ データのストリーミングに重ねてストリーミングされています。これは、Nanite のデータも Nanite を使用しないデータもランタイム時には必要ですが、Nanite を使用しないデータには、ランタイム仮想テクスチャ、ウォーター レンダリングなどが必須となるためです。つまり、データは 2 回ストリーミングする必要があり (一方は Nanite のストリーミングを使用するデータ セットで、もう一方はテクスチャのストリーミングを使用するデータ セット)、Nanite が有効な場合はメモリ内に常駐します。

  • Nanite のレンダリングを使用するとランタイム時のパフォーマンスが改善されます。これは、特にシャドウ パスに関連する場合に当てはまりますが、ソース データが同じため、視覚的な改善 (または品質低下) は想定されません。

  • 階層詳細度 (HLOD)/ストリーミングは、Nanite を使用しないランドスケープと同等になることが想定されます。

Nanite が有効なランドスケープの編集時には、Nanite メッシュのライブでのリビルドをオフ (Landscape.LiveRebuiltNaniteOnModification 0) で維持することをお勧めします。ランドスケープのレンダリングは、Nanite メッシュがリビルドされ、最新状態になるまで Nanite を使用しないランドスケープに依存します (保存時も、[Build] メニューの [Build Nanite Only] / [Build All Landscapes (すべてのランドスケープをビルド)] の使用時も同様)。Nanite を使用したランドスケープと Nanite を使用しないランドスケープには大きな視覚的な差がないため、Nanite を使用しないランドスケープ利用時のインエディタパフォーマンスが、プロジェクトのランタイム時の代表的なパフォーマンスとなるわけではありません。この場合、レンダリングにこのバージョンが使用されます。

一般的なコンテンツのパフォーマンス

比較のために、PS5 の Unreal Engine 5 テクニカル デモ「Lumen in the Land of Nanite」を例にとって、次の GPU 時間を記録します。

  • 平均レンダリング解像度は 1400p、タイミングは 4K にアップサンプリング

  • Nanite メッシュをカリングしてラスタライズする時間は約 2.5 ミリ秒 (デモのほとんどすべてのメッシュは Nanite メッシュ)

    • ジオメトリはほぼすべて Nanite メッシュ

    • シーンは完全に GPU によって駆動されるため、CPU オーバーヘッドはほとんどなし

  • 全ての Nanite メッシュ素材の計算時間は 2 ミリ秒

    • シーン内のマテリアルごとに 1 回のドローコールのみであるため、CPU コストは低い

GPU で費やされるこれらの時間は、Unreal Engine 4 の深度プリパスとベース パスの合計に相当するものを合計すると、約 4.5 ミリ秒になります。これにより、Nanite が 60 FPS をターゲットとするゲーム プロジェクトに適していることがわかります。

これらの数値は、本ページで説明してきたパフォーマンス上の欠点がないコンテンツを想定したものです。多数のインスタンスと多数の固有なマテリアルもコストの増加につながります。Nanite の開発においては、この点に対処すべく積極的な作業が行われています。

データ サイズ

Nanite では微細な詳細を実現できるため、これが幾何学的データの大幅な増加につながり、プレイヤーによるダウンロードの数とゲーム パッケージ サイズが増加すると思われるかもしれませんが、現実はそれほど恐ろしいものではありません。実際、Nanite の特殊なメッシュ エンコーディングにより、Nanite のメッシュ形式は標準的なスタティックメッシュ形式よりもはるかに小さくなります。

Unreal Engine 5 のサンプル プロジェクト『古代の谷』を例に挙げると、Nanite メッシュの入力三角ポリゴンはそれぞれ平均で 14.4 バイトを消費します。これは、100 万個の三角ポリゴンを含む平均的な Nanite メッシュには、およそ 13.8 メガバイト (MB) のディスク容量が必要であることを意味します。

従来のローポリ メッシュ (法線マップを使用) をハイポリ Nanite メッシュと比較すると、次の効果が見られます。

ローポリ メッシュ

  • 三角ポリゴン:19,066

  • 頂点:10,930

  • LOD 数:4

  • Nanite:無効

スタティックメッシュ圧縮パッケージのサイズ:1.34MB

Nanite メッシュ

  • 三角ポリゴン:1,545,338

  • 頂点:793,330

  • LOD 数: n/a

  • Nanite:有効

スタティックメッシュ圧縮パッケージのサイズ:19.64MB

ローポリ スタティックメッシュ | 4k 法線マップ

ハイポリ スタティックメッシュ | 4k 法線マップ

圧縮パッケージのサイズはアセットのフル サイズではありません。このメッシュのみで使用される固有のテクスチャもいくつかあるので、これらもカウントする必要があります。 メッシュで使用される多くのマテリアルには、さまざまな法線、ベース カラー、メタル、スペキュラ、ラフネス、マスク テクスチャで構成された独自のテクスチャが含まれています。

この特定のアセットは 2 つのテクスチャ (ベース カラーと法線) のみを使用するため、固有のテクスチャが多数含まれる他のアセットほどディスク容量を消費しません。たとえば、約 150 万個の三角ポリゴンを含む Nanite メッシュのサイズは 19.64MB となり、4k の法線マップ テクスチャのサイズよりも小さいことに留意してください。

テクスチャ タイプ

テクスチャ サイズ

ディスク上のサイズ

BaseColor

4k x 4k

8.2MB

法線

4k x 4k

21.85MB

このメッシュの圧縮パッケージ サイズとテクスチャの合計は次のとおりです。

  • ローポリ メッシュ:31.04MB

  • ハイポリ メッシュ:49.69MB

Nanite メッシュはすでに十分詳細であるため、その固有の法線マップを (他のアセットと共有されている) タイル化された詳細法線マップに置き換えることができます。この場合は品質が多少低下しますが、その損失は非常に小さく、ローポリとハイポリ メッシュの品質差よりもはるかに小さいことは確かです。したがって、4k の法線マップを使用したローポリ メッシュと比較すると、150 万個の三角ポリゴンで構成される Nanite メッシュは、サイズがより小さいながらも見かけがよりきれいになります。

Nanite が有効なメッシュとそのテクスチャの圧縮パッケージ サイズの合計は 27.83MB

ハイポリ スタティックメッシュ | with 4k Normal Map

Nanite メッシュ | with 4k Detail Normal Map

テクスチャの解像度と詳細な法線マップで実施できる実験はたくさんありますが、この比較が示しているのは、Nanite メッシュのデータ サイズは、アーティストが見慣れているデータとあまり変わらないということです。

最後に、ハイポリを使って Nanite 圧縮を標準的なスタティックメッシュ形式と比較できます。LOD0 ではどちらも同じです。

ハイポリ スタティック メッシュ

  • 三角ポリゴン:1,545,338

  • 頂点:793,330

  • LOD 数:4

  • Nanite:無効

スタティックメッシュ圧縮パッケージのサイズ:148.95MB

Nanite メッシュ

  • 三角ポリゴン:1,545,338

  • 頂点:793,330

  • LOD 数: n/a

  • Nanite:有効

スタティックメッシュ圧縮パッケージのサイズ:19.64MB

先述の Nanite 圧縮と比較すると、そのサイズは 19.64MB であり、4 つの LOD を持つ標準的なスタティック メッシュの圧縮の 7.6 分の 1 です。

Nanite 圧縮とデータ サイズは、Unreal Engine の将来のリリースで改善予定の重要な要素です。

データ サイズに関する全般的な推奨事項

Nanite と 仮想テクスチャリング システムを高速 SSD と組み合わせて使用することで、ジオメトリとテクスチャのランタイム割り当てに関する問題を軽減できます。その上で、最大のボトルネックはこのデータを顧客に提供する方法です。

ディスク上のデータ サイズは、コンテンツの配信方法、たとえば物理的なメディア経由なのか、インターネット経由でダウンロードさせるのか (ただし圧縮技術には限界があります) などを検討する際の重要な要素です。平均的なエンド ユーザーのインターネット帯域幅、光学メディアの容量、およびハード ドライブの容量は、ハード ドライブの帯域幅やアクセス レイテンシー、GPU のコンピューティング パワー、Nanite などのソフトウェア テクノロジーに対応できるほどには進歩していないことがデータをユーザーに配信することを困難にしています。

Nanite にとって、高精細メッシュのレンダリングは大きな問題ではありません。しかし、Unreal Engine 5 早期アクセス版に関する限り、ハード ドライブにデータを保存する方法はまだ改善が必要な領域です。

ビジュアライゼーション モード

Nanite は、進行中のシーン内でデータを検査するためのビジュアライゼーション モードを多数備えています。

レベル ビューポートの [View Modes (表示モード)] ドロップダウンから [Nanite Visualization (Nanite ビジュアライゼーション)] にカーソルを合わせて、目的のモードを選択します。

Nanite Visualization Menu in the Viewport

[Overview (概要)] ビジュアライゼーションを選択すると、レンダリングされたシーンが画像の中央に、選択した Nanite ビジュアライゼーションが参照用に画面の周囲に表示されます。

Nanite Overview Visualization

次の Nanite ビジュアライゼーション モードから選択できます。

Nanite ビジュアライゼーション

説明

Mask

Nanite ジオメトリを緑色で、非 Nanite ジオメトリを赤色でマーキングします。

Triangles

現在のシーン内にある Nanite メッシュのすべての三角ポリゴンを表示します。

Clusters

現在のシーン ビューにレンダリングされているすべての三角ポリゴン グループを色付きで表示します。

Primitives

インスタンス スタティックメッシュ (ISM) のすべてのインスタンスについて、コンポーネントをすべて同じ色で色付けします。

Instances

シーン内のインスタンスをそれぞれ異なる色でペイントします。

Overdraw

シーンのジオメトリで発生しているオーバードローの数を表示します。密に積み上げられた小さいオブジェクトは、大きなオブジェクトよりもオーバードローを発生させます。

Material ID

各 Nanite メッシュのマテリアル ID をそれぞれ色分けして表示します。

Lightmap UV

Nanite メッシュ サーフェスの UV 座標を表示します。

Evaluate WPO

Nanite が有効なジオメトリを、ワールド位置オフセットを使用するもの (緑色) と使用しないもの (赤色) に色分けします。

Nanite には、[Nanite Visualization] メニューで追加のビジュアライゼーション モードを有効にする 高度な ビジュアライゼーション モードがあります。これらの追加のビジュアライゼーションは、プログラマーが Nanite のさまざまな基礎となるコンテンツをデバッグまたは分析する際に役立ちます。

この高度なビジュアライゼーション モードを有効にするには、r.Nanite.Visualize.Advanced 1 コンソール変数を使用します。

コンソール変数とコマンド

Nanite のデバッグおよび設定時には、次の統計情報とコンソール変数を使用できます。

ランタイム時には、r.Nanite 0 コンソール変数を使用して、Nanite レンダリングをグローバルに有効または無効にすることができます。Nanite を無効にすると、Nanite をサポートしていないプラットフォームをエミュレートできます。

Nanite フォールバック レンダリング モード

Nanite が無効になっているか、プラットフォームでサポートされていない状況に向けて、Nanite ではフォールバック メッシュ レンダリング モードも提供します。r.Nanite.ProxyRenderMode コンソール変数を介して、使用するモードを制御できます。

  • 0 はデフォルト モードで、フォールバック メッシュのレンダリングにフォールバックします。または、設定されている場合はスクリーン空間駆動の LOD にフォールバックします。これは、スタティックメッシュ エディタのプロパティで設定されている 最小 LOD も認識します (先述の「フォールバック メッシュ」セクションを参照)。

  • 1 では、Nanite が有効なメッシュのすべてのレンダリングが無効になります。

  • 2 はモード 1 と同様に機能しますが、スタティックメッシュ エディタの [Show] > [Nanite Fallback] から Nanite フォールバックをレンダリングできます。

Nanite なしでサポート可能な数よりもはるかに多くのインスタンスが含まれるシーンについては、フォールバック レンダリング モード 1 と 2 の両方が役立ちます。これらのモードでは、Nanite をサポートしないプラットフォーム上でシーンをエディタで開けるようになります。

たとえば、Unreal Engine 5 のサンプル プロジェクト『古代の谷』では、Nanite を無効にすると数万回の定期的なドローコールが発生し、Nanite をサポートしていないプラットフォームでマップを開くことが困難になります。

Nanite 統計コマンド

Nanitestats コマンドを使用すると、Nanite のカリング統計情報がビューポートの右上に表示されます。 Nanite on-screen statistical display

Nanite によって画面に表示される統計情報を指定するには、コマンド引数を使用します。引数を指定しない場合はプライマリ ビューが使用されます。

Nanitestats List を使用すると、利用可能なすべてのビューがデバッグ出力に表示されます。

  • プライマリ

  • VirtualShadowMaps

利用可能な場合は、ShadowAtlasCubemapShadows に利用できる他の統計情報も表示される場合があります。このコマンドに続けて表示したい統計情報リストの名前を入力し、ビューを選択します。たとえば、NaniteStats VirtualShadowMaps を入力します。

2 パス オクルージョン カリングを使用するビューの場合、統計情報は Main と Post パスに分割されます。

Nanite ストリーミング プールのサイズを制御する

コンソール変数 r.Nanite.Streaming.StreamingPoolSize を使用して、Nanite のストリーミング データを保存するために使用するメモリ量を指定できます。メモリ プールを大きく設定すると、シーン内を移動するときの IO と圧縮解除のワークロードが軽減されますが、メモリ使用量は増加します。

メモリ プールがビューに必要なすべてのデータを収容するのに十分な大きさでない場合は、「キャッシュ スラッシュ」が発生する可能性があります。この場合、静的ビューであってもストリーミングが不安定のままとなります。

このコンソール変数はランタイム時には変更できず、コンフィグ ファイル (.ini) で指定する必要があります。

単一パスの最大クラスタ数を設定する

r.Nanite.MaxCandidateClustersr.Nanite.MaxVisibleClusters コンソール変数を使用すると、単一パスで使用される候補クラスタと可視クラスタの最大数をそれぞれ指定できます。それらの値は中間バッファのサイズ設定に使用されます。また、それらのデフォルト値には、一般的なレンダリング シナリオで機能する値が指定されています。

これらのバッファのいずれかを動的にサイズ変更したり、オーバーフロー時に品質を自動的に低下させたりするためのメカニズムは存在しないため、これらからのアーティファクトのレンダリングがシーンの複雑さに対応できないほど小さくなり、通常はジオメトリの欠落またはちらつきとして現れます。このようなアーティファクトが発生する場合は、Nanitestats を使って候補クラスタと可視クラスタの安全な値を判断します。具体的には、ClustersSWClustersHW の統計情報を参照してください。現在、候補クラスタのメモリ コストは 12 バイトで、可視クラスタは 16 バイトです。

このコンソール変数はランタイム時には変更できず、コンフィグ ファイル (.ini) で指定する必要があります。

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