Nanite 仮想化ジオメトリ

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

Windows
MacOS
Linux

nanite-combo.png

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

Nanite の利点

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

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

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

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

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

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

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

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

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 for Early Access ではサポートされていません。詳細については、このページの「サポートされている機能」セクションを参照してください。

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

サポートされているジオメトリに対して Nanite は、インポート時に有効化するか、個々のメッシュ エディタ を開いて有効化するか、コンテンツ ブラウザでのバッチ選択時に有効化することができます。

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

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

Nanite 用のメッシュをインポートする場合は、[Build Nanite (Nanite をビルド)] にチェックを入れます。

nanite-importoptions.png

Lightmass で事前計算されたライティングを使用しない場合は、ライトマップ UV の生成 を無効にすることをお勧めします。

非常に詳細なジオメトリを有効にすると、スタティック メッシュ データのインポートと構築にかなりの時間がかかる場合があります。また、プロパティが UV チャンネルを追加するため、高密度なメッシュのデータ量が膨大になる可能性があります。したがって、プロジェクトでベイク処理したライティングが必要なければ無駄なコストも省けます。

バッチ選択と個々のアセット

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

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

nanite-batchenable.png

または、スタティック メッシュ アセットと ジオメトリ コレクション (Chaos Physics が動かす破砕メッシュ) をそれぞれのエディタで開き、[Detail] パネルを使用して Nanite を有効にすることもできます。

スタティックメッシュの場合:

nanite-staticmesheditor-enablesetting.png

  1. スタティックメッシュ アセットを開きます。

  2. [Details] パネルの [Nanite Settings (Nanite 設定)][Enabled (有効化)] の横にチェックを入れます。

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

ジオメトリ コレクションの場合:

nanite-geometrycollections-enablesetting.png

  1. Geometry Collection アセットを開きます。

  2. [Details] パネルの [Nanite Settings (Nanite 設定)][Enabled Nanite] の横にチェックを入れます。

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

以下のセクションでは、Unreal Engine 5 早期アクセスのプロジェクトで Nanite を上手に使用して作業する方法について説明します。

ジオメトリ

Nanite はスタティックメッシュと ジオメトリ メッシュ で有効にすることができます。

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

  • スタティックメッシュ

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

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

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

Nanite は現在、剛体メッシュに限定されています。これらは、プロジェクトの典型的なシーンのジオメトリの 90% 以上を表し、Nanite 開発における最初のフォーカスです。Nanite は、剛体メッシュの動的変換、回転、および不均一なスケーリングをサポートしますが、動的または静的であっても一般的なメッシュ変形はサポートしません。これは、メッシュ全体に適用される単一の 4x3 マトリックスで表現できるよりも複雑な方法で、Nanite メッシュの任意の位置を意味します。

変形は以下を含みますが、これらに限定されません。

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

  • モーフ ターゲット

  • マテリアルのワールド ポーション オフセット

  • スプライン メッシュ

Nanite メッシュは現在以下をサポートしません。

  • カスタム深度またはステンシル

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

    • 特にエディタの メッシュ ペイント モードを使用するインスタンスごとのペイント カラーを意味します。

    • オリジナルのメッシュでインポートされた頂点カラーはサポート されます

シーンに存在可能なインスタンスの最大数は、200 万インスタンスまでです。これには、Nanite で有効なインスタンスだけでなく、ストリームされたすべてのインスタンスが含まれます。ストリームされたインスタンスのみがカウントされます。これは、Unreal Engine の将来のリリースに向けて積極的な改善が行われています。

Nanite が有効になっている場合、頂点ごとの接線はスタティック メッシュから保存されません。代わりに、接線空間は、ピクセル シェーダーから暗黙的に派生します。データサイズを小さくするため、接線データは保存されません。このアプローチを使用すると、接線空間に差異があり、エッジで不連続性が生じる可能性があります。ただし、これは重要な問題であることが証明されていません。 Unreal Engine の将来のバージョンでは、頂点接線をサポートする予定です。

マテリアル

以下のマテリアルと以下の設定は、Nanite メッシュに割り当てることが できません。それらは禁止されているか、使用しても Nanite メッシュには影響を与えません。

サポートされていないマテリアルは代わりにデフォルトのマテリアルを使用し、警告メッセージと情報の詳細を 出力ログ に出力します。

  • 不透明 を除くすべての ブレンド モード

    • これには、マスクと半透明のブレンド モードが含まれます。

  • Deferred Decal

    • Nanite メッシュの メッシュ デカール への使用など

    • Nanite メッシュに投影されたデカール メッシュをサポート

  • Wireframe

  • Pixel Depth Offset

  • World Position Offset

  • Custom Per-Instance Data

  • Two Sided

以下を使用するマテリアルは、Nanite メッシュに適用すると正しくレンダリングされず、明らかに壊れて見える場合があります。

  • Vertex Interpolator ノード

  • カスタム UV

レンダリング

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

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

    • 以下を伴うシーン キャプチャ

      • 非表示コンポーネント

      • 非表示アクタ

      • コンポーネントのみ表示

      • アクタのみ表示

    • 画面の最小半径

    • 距離カリング

    • FPrimitiveSceneProxy::IsShown() によってフィルタリングされたコンテンツ

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

  • 画面分割

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

  • ライト チャンネル

  • 完全に詳細な Nanite メッシュに対するレイトレーシング

    • レイ トレーシング機能をサポートしますが、ライトは特定の Nanite メッシュではなくプロキシ メッシュ (Nantie メッシュの簡略化された表現) と相互作用します。

  • 一部の可視化モードは、Nanite メッシュの表示をまだサポートしていません。

    詳細なジオメトリを表示するために、スタティック メッシュ エディタでビジュアリゼーション モードを使用する場合は注意が必要です。法線と UV を表示させると、エディタのぱろーマンスに問題が発生する場合があります。

対応プラットフォーム

Nanite は現在、PlayStation 5、Xbox Series S|X、および DirectX 11 または 12 の最新ドライバーを使用して、これらの仕様を満たすグラフィック カードを搭載した PC でサポートされています。

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

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

Nanite のプロキシ メッシュと精度の設定

スタティック メッシュには、Nanite の表現の精度を制御する追加のプロパティと、プロキシ メッシュと呼ばれる完全な詳細メッシュの粗い表現が含まれます。

これらの設定は、[Nanite Settings (Nanite の設定)] の下の [Static Mesh Editor (スタティック メッシュ エディタ)] の [Details (詳細)] パネルにあります。

nanite-staticmesheditor-enablesetting.png

頂点精度

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

nanite-staticmesheditor-positionprecision.png

精度を手動で微調整すれば、利点を得ることができる場合が多いです。ただしそれは、Auto のヒューリスティック手法の継続的な改善、適切な妥協点、または分離して考えた場合に少なくともほとんどのメッシュにとって適切な開始点となることを意図しています。

量子化は、圧縮の過程で多少の損失が発生します。このような圧縮方式は、モジューラーメッシュ要素または境界を共有するメッシュで作業する場合に特に問題になります。ジオメトリに穴や亀裂を起こさないように境界を完全に整列する場合は特にそうです。一貫性を維持するために、量子化は、メッシュ原点を中心に正規化されていないオブジェクトの座標で発生します。これにより、メッシュが同じ精度設定を使用している場合に量子化によってクラックが発生せず、メッシュの中心間の変換がその精度の倍数になることが保証されます。

プロキシ メッシュ

Unreal Engine の多くの部分は、従来のメッシュ レンダリングで提供されている、頂点バッファにアクセスする必要があります。スタティック メッシュで Nanite を有効にすると、非常に詳細な Nanite データがない場合にアクセスして使用することができる粗い表現が生成されます。このような場合、プロキシ メッシュ が表現として生成され、複雑なコリジョンが必要な場合や、プラットフォームが Nanite のレンダリングをサポートしていない場合などに使用されます。またプロキシ メッシュは、メッシュに静的ライティングがベイク処理されている場合にライトマスで使用されます。

Nanite の設定 [Proxy Triangle Percent (プロキシ トライアングルのパーセンテージ)] は、 粗い表現を生成するために使用される元の非常に詳細メッシュのトライアングルの割合を表します。テキスト フィールドは 0 ~ 100 の値を許可します。パーセンテージを大きくするほど、元のメッシュがより詳細に維持されます。値を 100 にするとデシメーションが実行されません。プロキシ メッシュは、プロキシの割合をどんなに小さくしても、2000 個のトライアングルが下限になります。

nanite-staticmesheditor-proxypercent.png

2000 個未満のトライアングルを持つメッシュで Nanite を有効にした場合、粗い表現のパーセンテージ範囲ではハードコードされた 2000 個のトライアングルが使用されるため、元のメッシュは自動的にプロキシ メッシュとして使用されます。

スタティック メッシュ エディタでは、[Show] > [Nanite Proxy] またはホットキー 「Ctrl + N」 を使用して、完全に詳細な Nanite 表現と、生成された Nanite プロキシ メッシュ表現を切り替えることができます。

nanite-proxymeshtoggle.png

以下で、メッシュの非常に詳細な Nanite 表現と、Nanite のレンダリングがサポートされていない場合に使用される生成されたプロキシ メッシュを比較することができます。これはUnreal Engine 5 の『「古代の谷」サンプル』から取得したメッシュの例です。

早期アクセスでは、スタティック メッシュ エディタに表示される トライアングル頂点 の統計情報には、Nanite が有効かどうかに関わらずプロキシ メッシュしか反映されていません。元のトライアングルの数を確認するには、Nanite をメッシュ上で一時的に無効にする必要があります。

完全に詳細な Nanite 表現

生成された Nanite プロキシ メッシュ

Proxy Triangle Percent の値を大きくすると、プロキシ メッシュ表現の元のメッシュの詳細がそのパーセンテージ分復元されます。プラットフォームまたは機能が Nanite レンダリングをサポートしていない場合に、この復元が必要になる場合があります。次の例は、元の生成されたプロキシ メッシュを、復元されたディテールのパーセンテージが大きい、トライアングル数が約 2 倍のプロキシ メッシュと比較したものです。

低プロキシ トライアングルのパーセンテージ

プロキシ・トライアングルのパーセンテージを増加

Nanite が有効にされたメッシュにカスタム プロキシ メッシュ LOD を使用する

プロキシ メッシュは、複雑なポリゴンごとのコリジョン、レイ トレーシング、ライト ベイクなどのエンジン機能に使用されます。Nanite がサポートされていないプラットフォームで実行する場合の直接描画にも使用されます。場合によっては、自動生成されたものではなく、手動で指定されたプロキシ メッシュ、または一連の従来の LOD をこのような用途に使用することが望ましい場合があります。たとえば、これにより、サポートされていないプラットフォームで実行するとき、またはレイ トレースされた反射で表示されるジオメトリを直接制御できます。

Nanite が有効にされたメッシュは、自動生成されたプロキシに常に LOD0 スロットを使用します。カスタム プロキシ、または一連の LOD を使用するには、以下のステップに従います。

  1. プロキシはこのアプローチを使用する場合に無視されるので、可能な限り小さくなるように Proxy Triangle Percent0 に設定します。

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

  3. スタティックメッシュ エディタの [Details] パネルの [LOD Settings][Minimum LOD]1 に設定します。これにより Nanite が生成したプロキシが無視されます。

  4. 複雑なコリジョンの場合は特別に設定が必要となります。LOD for Collision プロパティを使ってコリジョンに使用する LOD を指定します。これは LOD 0 を含めて、どの LOD でも構いません。

このアプローチを使って、すべてのケースで Nanite プロジェクトを自動的に Nanite に対応していないプラットフォームと互換性をもたせることは実現不可能です。Nanite は大量のインスタンスを効率的に処理しますが、Nanite が無効の場合、従来のレンダリング パイプラインのドローコース数は膨大になります。r.Nanite 0 を使ってグローバルな Nanite の無効化をテストすることができます。詳細は、このページの「コンソール変数とコマンド」セクションを参照してください。

このワークフローは積極的に開発が行われており、今後のリリースで改善されます。

パフォーマンスとコンテンツの問題

ほとんどの場合、Nanite は画面の解像度でうまく変化します。これは、2 つの重要なテクノロジに基づいて実行できます。つまり、きめ細かい LOD とオクルージョン カリングです。通常、これは、シーン内のソース データの幾何学的な複雑さに関係なく、Nanite が画面に描画しようとする三角形の数は同じままであり、ピクセル数に比例することを意味します。Nanite のデザイン哲学は、描画された三角形の数がピクセル数を超えるのは無駄であるというものです。

場合によっては、特定のタイプのコンテンツが Nanite で使用されるスケーリング テクノロジーを壊すことがありますが、これは、Nanite をこれらのコンテンツに使用してはならない、または従来のパイプラインよりもはるかに高速にレンダリングされない可能性があるという意味ではありません。このタイプのコンテンツの場合、これは、シーンの複雑さに基づくスケーリングではなく、ピクセルに基づくスケーリングが適用されなくなる可能性があることを意味します。このような状況を監視するには、Unreal Engine の プロファイリング 機能を使用してください。

集合ジオメトリ

集合ジオメトリとは、髪の毛、葉、草など、多くの小さなバラバラのオブジェクトが離れた場所にある 1 つのボリュームにマージされることを指します。これにより、元の LOD およびオクルージョン カリング方法が壊れます。

まず第一に、Nanite メッシュ自体が HLOD 構造であり、その方法は小さな三角形を大きな三角形に単純化することです。違いが小さすぎて認識できない場合、Nanite はより粗い三角形を選択します。これは、連続した表面では非常にうまく機能しますが、離れたところから見ると、個体表面よりも部分的な不透明な雲のように見える集合体ではうまくいきません。したがって、Nanite は、典型的な個体表面と同じくらい積極的に集合体を減らすことができないと判断する可能性が高く、その結果、カバーされる同じピクセル数に対してより多くの三角形が描画されます。

集合ジオメトリが影響を受ける 2 番目の最適化手法は、オクルージョン カリングです。オクルージョン カリングは非常に細かいですが、その粒度はピクセル レベルに達していません。穴で満たされたジオメトリ (さらに悪いことに、穴で満たされたジオメトリのレイヤーのレイヤー) は、画面上のその領域がその背後にある何かを黒くする前に、多くの深度レイヤーを構築する必要があるため、過度のオーバードローを引き起こします。画面上に 8x8 ピクセルの領域があり、各ピクセルが塗りつぶされる前に複数の深度レイヤーを描画する必要があると想像してください。このオーバードローは、Nanite が同じサイズのピクセル領域に対してより多くの三角形を描画しようとすることを意味し、レンダリング速度が低下します。

植生が最も明白な例ですが、たとえそうであっても、これは Nanite を植生グリッドに使用してはならないという意味ではありません。樹冠がいっぱいの森で、樹冠が個別にモデル化された葉で構成されている場合、Nanite は確かにうまく機能しませんが、Nanite を木の幹や枝に使用すると、効果が向上する可能性があります。理想的には、下にある個体表面の前に 1 つの層しかないため、建物の表面のブドウの木もうまく機能するはずです。実験してプロジェクトに適した条件を確認し、パフォーマンス分析機能を使用して、これらのメッシュを処理する際の Nanite のパフォーマンスを確認できます。

密に積み上げられた表面

実際に使用する上でのさまざまな制限により、従来のメッシュのオクルージョン カリングでは、大規模なモデル構築 (キットバッシング) プロセスを実装することはほとんど不可能です。Nanite のきめの細かいオクルージョン カリングの性質により、開発でこれらのワークフローをあまり心配せずに使用することができます。

集合ジオメトリ で説明されているように、オーバードローが発生する条件の 1 つは、可視面と隠面の下の距離が近すぎることです。特定のジオメトリが目に見える表面の下に適切に隠されている場合、それを検出して削除するための Nanite のコストは非常に低く、オーバーヘッドがないと考えることさえできます。しかしながら、いくつかのジオメトリが互いに積み重なっていて、それらがすべて最表面にある場合、Nanite はどちらが上か下かを判断できない可能性があり、両方のジオメトリが描画される原因となります。Nanite はどの面が最上層であるかを認識せず、すべてが描画されるため、典型的な最悪な状態となります。このような精度の誤差は、画面のサイズと距離によって異なるため、10 センチ メートル離れた場所ではレイヤーが分離され、近くではきれいに見えますが、距離が離れると距離の差が 1 ピクセルよりも小さくなり、オーバードローになります。

Unreal Engine 5 のサンプル プロジェクト『古代の谷』は、サーフェスが密接に積み重なって大量のオーバードローを引き起こす可能性があることを示しています。キャラクターの足を見れば、距離が離れたときに画面上のどのくらい小さな領域を使用することになるかが分かります。

ゲーム ビュー

![密に積み上げられた多数のNaniteインスタンス]Many Nanite instances closely stacked together

カメラを動かして、キャラクターが立っている領域とこれらの積み重ねられた表面を見下ろします。Overdraw オプションは、これらの積み重ねられた表面がどのようにレンダリングされるかを示すことができます。

nanite-overdrawvis.png

この視覚化オプションは、同様の問題を見つけるための最良の方法です。ある程度のオーバードローが予想されますが、その量が多すぎると、Nanite のカリングとラスタライズのコストが高くなり、シーンの複雑さに関係なく Nanite のスケーリングの効果が低下します。

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

高精度メッシュをインポートする場合、対応するファセット法線を簡単にインポートできます。メッシュで少量の頂点を共有すると、レンダリング パフォーマンスとデータ サイズのオーバーヘッドが非常に大きくなるので、ファセット法線の使用を避けるように注意してください。メッシュ内の頂点の数は三角形の数より少ないことが理想です。比率が 2:1 以上の場合、特に三角形の数が多い場合に問題が発生する可能性があります。比率が 3:1 の場合、メッシュは完全にファセットであり、各三角形には 3 つの個別の頂点があり、どの頂点も他の三角形と共有されていないことを意味します。ほとんどの場合、これは法線がスムージングされていないために異なるためです。

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

たとえば、左側の画像の下にある 2 つのメッシュを見てください。左のメッシュにはファセット法線があり、右のメッシュにはスムーズな法線があります。Nanite の Triangle 視覚化機能は、2 つの描画に使用された三角形の数に有意差があることを示しています。

ファセット法線 (左) とスムーズな法線 (右) を使用する Nanite メッシュ

ファセット法線 (左) およびスムーズな法線 (右) を持つ Nanite 対応メッシュの Nanite の 三角形の視覚化

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

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

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

比較のために、PS5 の Unreal 5 テクノロジーのデモンストレーション『Lumen in the Land of Nanite』を例にとって、GPU に時間がかかる情報を記録します。

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

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

    • 形状はほぼ全て Nanite メッシュ

    • シーンは 100% GPU によって駆動されるため、CPU オーバーヘッドはほとんどありません

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

    • シーン内の各マテリアルは 1 回の描画呼び出しのみを生成するため、CPU オーバーヘッドは小さくなります。

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

このタイプのデータの前提は、プロジェクトに上記のさまざまなパフォーマンス上の欠点がないことです。多数のインスタンスと多数のユニークな素材もコストの増加につながりますが、これも現在の Nanite の開発のフォーカスの 1 つです。

データサイズ

Nanite は多くの微細な詳細を実現できるため、幾何学的データの大幅な増加を意味し、プレーヤーのゲーム パッケージとダウンロード データの増加につながると考えるかもしれません。しかし、現実はそれほど恐ろしいものではありません。実際、Nanite には特別なグリッド エンコーディング フォーマットがあるため、Nanite のグリッド フォーマットは標準の静的グリッド フォーマットよりもはるかに小さくなっています。

たとえば、Unreal 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 つのテクスチャ (ベース カラーと通常のテクスチャ) のみを使用するため、さまざまなテクスチャを使用する他のアセットのようにディスク容量を消費しません。たとえば、Nanite メッシュ (約 150 万個の三角形) のサイズは、4k の法線マップ テクスチャのサイズ (19.64MB) よりも小さいことに注意してください。

テクスチャ タイプ

テクスチャ サイズ

ディスク上のサイズ

ベースカラー

4k x 4k

8.2MB

法線

4k x 4k

21.85MB

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

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

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

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

圧縮パッケージの合計サイズ (Nanite メッシュとテクスチャを含む): 27.83MB

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

Nanite メッシュ|4k 詳細な法線マップ

テクスチャの解像度と詳細な法線マップで実施できる実験はたくさんありますが、この比較が示しているのは、 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 と 仮想テクスチャ システムを高速ソリッド ステート ハード ドライブと組み合わせて使用​​すると、ジオメトリとテクスチャのランタイム バジェットを削減できます。最大のボトルネックは、このデータを顧客に提供する方法です。

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

Nanite にとって、高精細メッシュのレンダリングは大きな問題ではありません。 しかし、Unreal Engine 5 Early Access Edition に関する限り、ハード ドライブにデータを保存する方法はまだ改善が必要な領域です。 この点は、将来のエンジン バージョンで引き続き改善されます. 方法には、詳細を再利用し、より優れたツールを使用して、どの詳細を破棄できるかを判断し、アートの品質を保証することが含まれます。

Nanite の将来の発展に目を向けると、業界で長い間使用されてきた、以下のようなテクスチャ データの管理方法には多くの類似点があります。

  • テクスチャ タイリング

  • UV スタッキングとミラーリング

  • 詳細テクスチャ

  • テクスチャ メモリ レポート

  • 最終的なパッケージ データの MIP レベルの減少

同様の戦略が Unreal Engine 5 のジオメトリのために研究、開発されています。

ビジュアリゼーション モード

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

レベル ビューポートの [View Modes] ドロップダウン メニューで、[Nanite Visualization] の上にマウスを置き、オプションから選択します。

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

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

nanite-vis-overview.png

他には以下のような可視化モードがあります。

Nanite 可視化モード

説明

Mask

Nanite メッシュを緑、非 Nanite メッシュを赤でマークします。

Triangles

現在のシーンのすべての Nanite メッシュの三角形を表示します。

Clusters

現在のシーン ビューでレンダリングされているすべての三角形グループを (カラーで) 表示します。

Primitives

インスタンスのスタティックメッシュ (ISM) のすべてのインスタンスにすべて同じ色で表示します。

Instances

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

Overdraw

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

Material Complexity

Nanite のジオメトリにあるマテリアルの複雑さを表示します。

Material ID

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

Lightmap UV

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

Nanite には、レベル ビューポートの [Display]> [Visualization] メニューのすべての視覚化オプションを含む Advanced モードが含まれています。これらの追加の視覚化機能は、プログラマーが Nanite のさまざまな基礎となるコンテンツをデバッグまたは分析するのに非常に役立ちます。このモードは、コンソール変数 r.Nanite.Visualize.Advanced 1 で有効にできます。

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

Nanite をデバッグおよび構成するには、次の統計とコンソール変数を使用します。

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

Nanite プロキシ レンダリング モード

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

  • 0 はデフォルト モードです。1 に設定すると、プロキシ メッシュのレンダリングにフォールバックするか、画面スペースに基づいて LOD を使用します (上記の プロキシ メッシュ セクションを参照)。

  • 1 は、すべての Nanite 対応メッシュのレンダリングを無効にします。

  • 2 は、モード 1 と同様ですが、Static Mesh Editor の [Display] > [Nanite Proxy] で Nanite プロキシをレンダリングできます。

シーンのインスタンスの数が非常に多く、通常の状況 (つまり、Nanite が有効になっていない場合) の数をはるかに超える場合は、プロキシ レンダリング モード 1 と 2 の両方が役立ちます。Nanite をサポートしていないプラットフォーム上のエディターでシーンを開くことができます。たとえば、Unreal Engine 5 のサンプル プロジェクト『古代の谷』では、Nanite を無効にすると数万回の定期的なドロー コールが発生し、Nanite をサポートしていないプラットフォームでマップを開くことが困難になります。

Nanite統計コマンド

コンソールで Nanitestats コマンドを入力すると、現在のビューの Nanite カリング統計が画面の右側に表示されます。

nanite-nanitestats.png

コマンド パラメータを使用して、Nanite が画面に表示する統計を指定できます。パラメータが指定されていない場合、メイン ビューが使用されます。

Nanitestats List は、デバッグ出力で使用可能なビューのリストを生成します。

  • Primary

  • VSM_Directional

  • VSM_Perspective

  • ShadowAtlas0

  • ShadowAtlas1

  • ShadowAtlas2

ビューを選択する必要がある場合は Nanitestats と入力し、その後に使用するパラメータを入力します。たとえば、Nanitestats VSM_Directional

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

統計データ名

説明

PRE-CULL

カリング段階前のインスタンスの数。

POST-CULL

可視性テストが完了した後の残りのインスタンスの数。

NODEVISITS

消去プロセス中に訪問した階層ノードの総数。

CANDIDATES

可視性テストを必要とする、階層トラバーサル中に発見されたクラスターの数。

CLUSTERSSW

ソフトウェア ラスタライズを使用してレンダリングされた可視クラスターの数。

CLUSTERSHW

ソフトウェア ラスタライズを使用してレンダリングされた可視クラスターの数。

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

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

早期アクセス バージョンに関する限り、メモリ プールがビューに必要なすべてのデータを収容するのに十分な大きさでない場合、「キャッシュ スラッシュ」が発生し、静的ビューであってもストリーミングが発生します。

このコンソール変数は実行時に変更できず、構成 (.ini) ファイルで指定する必要があります。

単一チャネルの最大クラスタ数を設定する

コンソール変数 r.Nanite.MaxCandidateClustersr.Nanite.MaxVisibleClusters は、単一のパスで候補クラスターと可視クラスターの最大数を指定できます。それらの値は中間バッファーのサイズを決定するために使用でき、それらのデフォルト値 (それぞれ 8388608 および 2097152) は一般的なゲーム レンダリング シーンで使用されてきました。

早期アクセス バージョンでは、これらのバッファーのサイズを動的に調整するメカニズムがなく、オーバーフローしたときに自動的に品質を下げる方法もありません。これらの値がシーンの複雑さに対応するには小さすぎる場合、通常はジオメトリの欠落またはちらつきの形で、レンダリング アーティファクトが発生する可能性があります。このようなレンダリング アーティファクトが発生した場合は、 Nanitestats を使用して、候補クラスターと可視クラスターの適切な値を決定してください (CLUSTERSSW および CLUSTERSHW 統計を参照)。現在、候補クラスタのメモリオーバーヘッドは 12 バイトで、可視クラスタは 16 バイトです。

このコンソール変数は実行時に変更できず、構成 (.ini) ファイルで指定する必要があります。