Nanite は Unreal Engine 5 の仮想化ジオメトリ システムであり、新しい内部メッシュ フォーマットとレンダリング テクノロジーを活用して、ピクセル スケールのディテールと多数のオブジェクトをレンダリングします。人が知覚できるディテールだけをインテリジェントに処理し、それ以上は行いません。Nanite のデータ形式は高度に圧縮され、きめ細かいストリーミングと自動詳細度 (LOD) をサポートします。
Nanite の利点
ジオメトリの複雑さが数桁分増加して、リアルタイムで以前よりも多くの三角形とオブジェクトを処理可能になりました
フレーム バジェットが、ポリゴン数、ドローコール、メッシュ メモリ使用の制限を受けなくなりました
ZBrush スカルプトやフォトグラメトリ スキャンといったフィルム品質のソース アートを直接インポートすることが可能になりました
ディテールを通常のマップ テクスチャにベイクするのではなく、ハイ ポリゴンのディテールを使用します
詳細度 (LOD) が自動的に処理されるため、個々のメッシュの LOD を手動で設定する必要がなくなりました
品質の低下は、特に LOD トランジションでは稀であるか、存在しません
これらの利点は非常に革新的なものですが、実際にはまだいくつかの制限も残っています。たとえば、コンテンツとハードウェアを組み合わせる上で、インスタンス数、メッシュあたりの三角ポリゴン数、マテリアルの複雑さ、出力解像度、およびパフォーマンスを慎重に測定する必要があります。Nanite は比較的新しい技術であり、今後の Unreal Engine のリリースにおいて継続的に機能の拡張およびパフォーマンスの改善が行われる予定です。
Nanite メッシュとスタティック メッシュの違い
Nanite メッシュとは、Nanite が有効なスタティック メッシュを指します。Nanite メッシュは基本的に三角ポリゴンのメッシュであり、データには多くの詳細度 (LOD) と圧縮が適用されています。それに加えて、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 をビルド)] チェックボックスをオンにします。
ライトマス で事前計算されたライティングを使用しない場合は、[Generate Lightmap UVs (ライトマップ UV の作成)] を無効にすることをお勧めします。
このプロパティを有効にすると、高精細ジオメトリにより、スタティック メッシュ データのインポートと構築にかなりの時間がかかります。また、このプロパティにより、高密度なメッシュ用の膨大な量のデータを含む UV チャンネルがさらに追加されます。プロジェクトでベイク処理したライティングが必要でなければ、このような追加コストを抱える必要はありません。
アセットで Nanite を有効にする
プロジェクトに Nanite を有効にしたいコンテンツがすでに取り込まれている場合は、コンテンツ ブラウザを使用してアセットをバッチで有効にするか、それぞれ独自のエディタを使って個々のアセットを有効にすることができます。
メッシュで Nanite をバッチで有効にする
Nanite を有効にしたいスタティック メッシュ アセットのバッチについては、まず コンテンツ ブラウザ を使ってそれらをすべて選択し、右クリック してコンテキスト メニューから [Nanite] > [Enable (有効化)] を選択します。
個別のメッシュで Nanite を有効にする
スタティック メッシュや ジオメトリ コレクション (Chaos 物理駆動型の破砕メッシュ) など、Nanite をサポートするメッシュのエディタを開き、[Details (詳細)] パネルを使って Nanite を有効にします。
スタティック メッシュ エディタ内で、[Nanite Settings (Nanite 設定)] セクションにある [Enable Nanite Support (Nanite サポートを有効化)] チェックボックスをオンにします。
ジオメトリ コレクション エディタ内では、[Nanite] セクションにある [Enable Nanite (Nanite を有効にする)] チェックボックスをオンにします。
Nanite のサポートされている機能
このセクションでは、Unreal Engine プロジェクトで Nanite を最大限活用する方法と、サポートされる機能とそうでないもの、さらに制限事項について説明します。
ジオメトリ
Nanite は、スタティック メッシュおよび ジオメトリ コレクション で有効にすることができます。
Nanite が有効なメッシュは、次のコンポーネント タイプで使用できます。
スタティックメッシュ
インスタンス化されたスタティックメッシュ
階層インスタンス化されたスタティックメッシュ
ジオメトリ コレクション
現時点で Nanite は剛体メッシュに限定されています。剛体メッシュは典型的なシーンに含まれるジオメトリの 90% 以上を表すものです。Nanite は、剛体メッシュの動的変換、回転、および不均一なスケーリングをサポートしますが、動的または静的であっても一般的なメッシュ変形はサポートしません。これは、メッシュ全体に適用される単一の 4x3 マトリックスで表現できるよりも複雑な方法で、Nanite メッシュの任意の位置を意味します。
変形は以下でサポートされていませんが、これらに限定されません。
スケルトン アニメーション
モーフ ターゲット
マテリアルのワールド ポーション オフセット
スプライン メッシュ
Nanite メッシュは現在以下をサポートしていません。
カスタム深度またはステンシル
インスタンス上の頂点ペイント
特に、エディタのメッシュ ペイント モードを使用する、インスタンスごとのペイント カラーを指します。
元のメッシュにインポートされた頂点カラーは サポートされます。
シーンに存在可能なインスタンスの最大数は 1600 万インスタンスに固定されています。これには、Nanite の使用が有効になっているものだけでなく、ストリーミングで入力されるすべてのインスタンスが含まれます。ストリーミングで入力されるインスタンスのみが合計にカウントされます。
Nanite が有効になっている場合、頂点ごとの接線はスタティック メッシュから格納されません。代わりに、接線空間がピクセル シェーダーで暗黙的に派生します。データ サイズを小さくするために、接線データは格納されません。このアプローチを使用した際に接線空間に生じる差異により、エッジ部分で不連続性が発生する場合があります。ただし、この特定の問題が深刻になることは確認されておらず、頂点接線は今後のリリースでサポートされる予定です。
マテリアル
Nanite は、ブレンド モードが Opaque (不透明) に設定されているマテリアルをサポートします。他のマテリアル タイプは許可されていないか、使用しても Nanite メッシュには影響を与えません。
サポートされないマテリアルが検出されるとデフォルトのマテリアルが割り当てられて、アウトプットログ に追加の情報とともに警告が表示されます。
次は、サポートされない Nanite マテリアル機能の一例です。
Masked (マスク) または Translucent (透過) のブレンド モード
ディファード デカール
メッシュ デカールに Nanite メッシュを使用すること。
Nanite は、そのサーフェスへのデカールの投影はサポートします。
ワイヤーフレーム
両面
ピクセル深度オフセット
ワールド位置オフセット
インスタンスごとのカスタム データ
Nanite が有効なメッシュに適用されるマテリアルで次のものを使用すると、メッシュの表示に問題が生じます
Vertex Interpolator ノード
カスタム UV
レンダリング
以下のレンダリング機能は現在サポートされていません。
以下を使用するビュー関連のオブジェクトのフィルタリング:
画面の最小半径
距離カリング
フォワード レンダリング *VR のステレオ レンダリング
画面分割
マルチサンプル アンチエイリアス (MSAA)
ライト チャンネル
完全に詳細な Nanite メッシュに対するレイトレーシング
レイトレーシング機能はサポートされますが、光線は完全に詳細な Nanite メッシュではなく、粗い表現 (フォールバック メッシュ) と交差します。
一部のビジュアライゼーション表示モードは、Nanite メッシュの表示をまだサポートしていません。
詳細なジオメトリを表示するために、スタティック メッシュ エディタでビジュアリゼーション モードを使用する場合は注意が必要です。法線と UV を表示させると、エディタのぱろーマンスに問題が発生する場合があります。
サポートされるプラットフォーム
Nanite は現在 PlayStation 5、Xbox Series S|X、そして 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] セクションにあります。
[Nanite Settings] には次のプロパティが含まれます。
プロパティ |
説明 |
---|---|
Position Precision |
Nanite メッシュの生成時にメッシュで使用する精度を選択します。[Auto (自動)] に設定すると、メッシュのサイズに基づいて適切な精度が選択されます。精度は、精度の向上やディスク容量の最適化のためにオーバーライドすることができます。 |
Minimum Residency |
メッシュで常にメモリ内に維持するメモリ バイト サイズを設定します。残りはストリーミングされます。これを高く設定するとより多くのメモリが必要になりますが、一部のメッシュではストリーミングが頻発する問題が軽減されます。 |
Keep Triangle Percent |
ソース メッシュから維持する三角ポリゴンの比率です。ディスク容量を最適化するにはこの比率を下げます。 |
Trim Relative Error |
Nanite メッシュからの削除が可能な相対誤差の最大値を設定します。この相対誤差の値よりもビジュアル面の影響が少ないソース メッシュのすべての詳細が削除されます。相対誤差に単位サイズはありません。また、相対誤差はメッシュのサイズを基準としています。Nanite は、デフォルトで元のソース メッシュの三角ポリゴンをすべて格納します。 |
Fallback Triangle Percent |
Nanite のソース メッシュを削減する際に維持する三角ポリゴン比率を設定します。Nanite のレンダリングをサポートしないプラットフォームなどで完全に詳細な Nanite データを使用できない場合や、複雑なコリジョンでの使用など、Nanite データの使用が実用的でない場合に、これが粗い表現 (もしくはフォールバック メッシュ) となります。 |
Fallback Relative Error |
フォールバック メッシュからの削除が可能な相対誤差の最大値を設定します。この相対誤差の値よりもビジュアル面の影響が少ない生成済みのフォールバック メッシュのすべての詳細が削除されます。相対誤差に単位サイズはありません。また、相対誤差はメッシュのサイズを基準としています。 |
頂点精度
Nanite は、メッシュの頂点の位置を量子化してメモリ密度を最大化し、ディスク容量を最小限に抑えます。量子化ステップ サイズは 2 の累乗であり、Position Precision プロパティを使用して、個々のメッシュの要件に合うように選択することができます。デフォルトの [Auto (自動)] では、メッシュのサイズとその三角ポリゴン密度に基づいて適切な精度が選択されます。精度の向上やディスク容量の最適化のために、手動で精度サイズを選択してオーバーライドできます。
量子化は、圧縮の過程で多少の損失が発生します。このような圧縮方式は、モジューラー メッシュ要素または境界を共有するメッシュで作業する場合に特に問題になります。ジオメトリに穴や亀裂を起こさないように境界を完全に整列させる場合は特にそうです。
一貫性を維持するために、量子化は、メッシュ原点を中心に正規化されていないオブジェクトの座標で行われます。これにより、メッシュで同じ精度設定を使用している場合は量子化によってクラックが発生せず、メッシュの中心間の変換がその精度の倍数になることが保証されます。
データのトリミング
ディスク容量を最適化するために、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 フォールバック メッシュのデフォルト設定を比べています。
元のソース メッシュから元の詳細をどれだけ維持するかを Fallback Relative Error プロパティで指定し、その詳細をどれだけ使用するかを Fallback Triangle Percentage プロパティで設定します。
次の比較画像では、フォールバック メッシュで Fallback Triangle Percent が 100% に維持されていますが、元のソース メッシュからの三角ポリゴンをより多く使用するために Fallback Relative Error が調整されています。これらの値を調整する場合に、Nanite 三角ポリゴンの Nanite 詳細をそれらの値を変更する際のインジケーターとしてビューポート内で使用できます。
フォールバック メッシュのビジュアライゼーション
スタティック メッシュ エディタでは、完全な詳細の Nanite メッシュと Nanite フォールバック メッシュを、ビューポートの [Show (表示)] メニューにある [Nanite Fallback (Nanite フォールバック)] オプションを使って切り替えることができます。また、Ctrl + N ホット キーを使って 2 つのビジュアライゼーション モード間を切り替えることもできます。
Nanite が有効なメッシュにカスタム フォールバック メッシュ LOD を使用する
フォールバック メッシュは、複雑なポリゴンごとのコリジョン、レイトレーシング、ライトのベイク処理などのエンジン機能に使用されます。また、Nanite をサポートしないプラットフォームにも使用されます。フォールバック メッシュの生成時には、Nanite が有効なメッシュでは、常にソース メッシュの LOD0 スロットを使用してフォールバック メッシュを自動生成します。ただし、自動生成されたものではなく、手動で指定されたフォールバック メッシュ、または一連の従来の LOD を使用することが望ましい場合もあります。
このようなレベルで制御が可能なことで、Nanite をプロジェクトだけでなく、レイトレースされた反射に見られるジオメトリを直接制御する手段として、または Nanite をサポートしないプラットフォームに対して使用できます。
独自のカスタム フォールバック メッシュを指定したり、一連の LOD を使用したりするには、次の手順に従います。
[Fallback Triangle Percent] を「0」に設定して、フォールバック メッシュを可能な限り小さくします。このアプローチを使用する場合、これが無視されるためです。
この 従来の LOD 設定 方法を使って、メッシュに 1 つ以上の LOD を追加します。
[LOD Settings (LOD 設定)] セクションで、[LOD Import (LOD インポート)] ドロップダウンを [Import LOD Level 1 (LOD レベル 1 のインポート)] に設定します。
[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 は画面の解像度で非常にうまくスケーリングされます。これは、非常にきめ細かい詳細度 (LOD) とオクルージョン カリングという 2 つの機能により実現するものです。通常、これは、シーン内のソース データの幾何学的な複雑さに関係なく、Nanite が画面に描画しようとする三角ポリゴンの数は一定で、ピクセル数に比例することを意味します。
Nanite のデザイン哲学は、描画された三角形の数がピクセル数を超えるのは無駄であるというものです。
Nanite が使用するスケーリング技法が機能しないコンテンツもありますが、これは、Nanite をこのようなコンテンツに使用すべきではないことや、従来のパイプラインよりも高速にレンダリングされないことを意味するわけではなく、このようなタイプのコンテンツには、シーンの複雑さに基づくスケーリングではなく、ピクセルに基づくスケーリングが適用されないことを意味します。このような状況の発生を監視するには、Unreal Engine の プロファイリング 機能を使用してください。
集合ジオメトリ
集合ジオメトリとは、髪の毛、葉、草など、結合されていない多くの小さなオブジェクトが離れた場所では 1 つのボリュームにマージされるジオメトリを指します。このようなタイプのジオメトリでは、Nanite の LOD とオクルージョン カリングが機能しません。
Nanite 自体が HLOD 構造であり、小さな三角ポリゴンを大きな三角ポリゴンに簡素化する機能に依存し、違いが小さくて認識できない場合はより粗いものを選択します。連続したサーフェス上では非常にうまく機能しますが、離れたところから見ると、ソリッド サーフェスと言うよりも部分的に不透明な雲のように見える集合ジオメトリではうまくいきません。
したがって、Nanite では、集合ジオメトリを典型的なソリッド サーフェスと同じように積極的に削減できないと判断する可能性が高く、その結果、対象となる同じピクセル数に対してより多くの三角ポリゴンが描画されます。
集合ジオメトリで機能しない別の最適化手法として、オクルージョン カリングがあります。オクルージョン カリングは非常にきめ細かいものですが、その粒度はピクセル レベルに達していません。多数の穴を含むジオメトリ (さらに悪いことに、多数の穴を含むジオメトリのレイヤーのレイヤーなど) は、画面上のその領域によって背後にあるオブジェクトがブロックされる前に多くの深度レイヤーを構築する必要があるため、過度なオーバードローを引き起こします。例えば、画面上に 8x8 ピクセルの領域があり、各ピクセルを塗りつぶすために複数の深度レイヤーを描画する必要があると考えることができます。この過度なオーバードローは、Nanite が同じサイズのピクセル領域に対してより多くの三角ポリゴンを描画しようとすることを意味し、レンダリング速度が低下します。
オクルージョン カリングの問題を引き起こすものの例としてはフォリッジが最もわかりやすいですが、フォリッジ系のメッシュに Nanite を使用してはいけないという意味ではありません。樹冠がいっぱいの森で、樹冠が個別にモデル化された葉で構成されている場合、Nanite がうまく機能しない可能性は高いものの、木の幹や枝に対しては Nanite で効果が向上することもあります。建物の表面を覆うブドウの木についても、その下にあるソリッド サーフェスの上には 1 つのレイヤーしかないため、うまく機能する可能性があります。
さまざまなユース ケースを試し、プロジェクトに適した使用方法を確認してください。プロファイリング ツールを活用することで、これらのタイプのメッシュに対して Nanite を使用することのパフォーマンスを確認できます。
密に積み上げられたサーフェス
実際に使用する上でのさまざまな制限により、従来のメッシュのオクルージョン カリングでは、大規模なモデル構築 (キットバッシング) ワークフローを実装することはほとんど不可能です。Nanite のきめの細かいオクルージョン カリングの性質により、開発時にこのようなワークフローを使用する際の懸念を軽減できます。
先述の「集合ジオメトリ」セクションで説明したように、オーバードローが発生する原因として、可視サーフェスがその下の隠れたサーフェスと非常に近いことが挙げられます。特定のジオメトリが可視サーフェスの下に適切に隠されている場合、それを検出してカリングするための Nanite のコストは非常に低く、オーバーヘッドも存在しないものと考えることができます。しかしながら、最も上のサーフェス付近でいくつかのジオメトリが互いに積み重なっている場合、Nanite ではどちらが上か下かを判断することができず、両方のジオメトリが同時に描画される原因となります。
カリングに関するこの特定の問題は、Nanite がどのサーフェスが最上層であるかを認識せず、すべてのレイヤーが描画されるという最悪なシナリオとなります。このような精度の誤差は、画面のサイズと距離によって異なるため、10 センチ メートル離れた場所ではレイヤーが分離され、サーフェス付近ではきれいに見えますが、距離が離れると距離の差が 1 ピクセルよりも小さくなり、オーバードローになります。
次の例では、キャラクターが立っている場所を見下ろすようにカメラが移動した際に、Nanite の**オーバードロー** ビジュアライゼーションによって、これらの積み重ねられたサーフェスがどのようにレンダリングされるかが示されます。明るい領域は、他の領域よりも多くのオーバードローが生じていることを示しています。
このオーバードロー ビジュアライゼーションは、オーバードローの問題を検出するための最良の方法です。ある程度のオーバードローが予想されますが、その量が多すぎると、Nanite のカリングとラスタライズのコストが高くなり、シーンの複雑さにかかわらず、プロセスにおける Nanite のスケーリングの効果が低下します。
ファセット法線とハードエッジ法線
留意すべき問題として、ファセット法線を含む高精細のメッシュをインポートする際には、2 つのポリゴン間にある法線が平滑化されていないという点があります。これは一般的な問題ですが見落としやすく、メッシュで少量の頂点を共有すると、レンダリング パフォーマンスとデータ サイズの両方のコストが大幅に高くなるため、この特定の問題に注意する必要があります。
メッシュの頂点の数を、それに含まれる三角ポリゴンの数よりも少なくすることが理想的です。この比率が 2:1 以上の場合、特に結果として三角ポリゴンの数が多くなる場合は、問題が発生する可能性が高くなります。比率が 3:1 になるとメッシュは完全にファセットとなります。この場合、各三角ポリゴンには 3 つの個別の頂点が含まれますが、どの頂点も他の三角ポリゴンとは共有されません。ほとんどの場合、法線が平滑化されないため、これらが同じにならないことが原因です。
これを念頭に、より多くの頂点によって格納するデータが増えることに留意してください。また、これはより多くの頂点変換作業を意味し、2:1 よりも高い比率では遅いレンダリング パスになります。ハード サーフェス モデリングでの意図的な使用には問題はなく、使用しない理由もありません。ただし、100% ファセットの密集したメッシュは、予想よりもはるかにコストが高くなります。また、別の注意点として、他の DCC パッケージで生成された密度の高い有機タイプのサーフェス上にインポートされた法線は、低いポリゴン メッシュで認識される可能性のあるハード法線しきい値を備えていますが、これによって Nanite で不要なコストが発生する可能性があります。
たとえば、下の 2 つのメッシュでは、左のものにはファセット法線があり、右のものには平滑化された法線があります。Nanite の トライアングル ビジュアライゼーションを使ってこれらを比較すると、Nanite によって描画に使用される三角ポリゴンの数に大きな違いがあることがわかります。左のファセット法線には、右の平滑化された法線よりもはるかに多い数の三角ポリゴンが描画されています。
ファセット法線 (左) とスムーズな法線 (右) を使用する 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 メッシュと比較すると、次の効果が見られます。
ローポリ メッシュ
スタティックメッシュ圧縮パッケージのサイズ: 1.34MB |
Nanite メッシュ
スタティックメッシュ圧縮パッケージのサイズ: 19.64MB |
圧縮パッケージのサイズはアセットのフル サイズではありません。このメッシュのみで使用される固有のテクスチャもいくつかあるので、これらもカウントする必要があります。 メッシュで使用される多くのマテリアルには、さまざまな法線、ベース カラー、メタル、スペキュラ、ラフネス、マスク テクスチャで構成された独自のテクスチャが含まれています。
この特定のアセットは 2 つのテクスチャ (ベース カラーと法線) のみを使用するため、固有のテクスチャが多数含まれる他のアセットほどディスク容量を消費しません。たとえば、約 150 万個の三角ポリゴンを含む Nanite メッシュのサイズは 19.64MB となり、4k の法線マップ テクスチャのサイズよりも小さいことに留意してください。
テクスチャ タイプ |
テクスチャ サイズ |
ディスク上のサイズ |
---|---|---|
ベースカラー |
4k x 4k |
8.2MB |
法線 |
4k x 4k |
21.85MB |
このメッシュの合計サイズと圧縮後のテクスチャは次のとおりです。
ローポリ メッシュ: 31.04MB
ハイポリ メッシュ: 49.69MB
Nanite メッシュはすでに十分詳細なので、その固有の法線マップを (他のアセットと共有されている) タイル化された詳細法線マップに置き換えることができます。この場合は品質が多少低下しますが、その損失は非常に小さく、ローポリとハイポリ メッシュの品質差よりもはるかに小さいことは確かです。したがって、4k の法線マップを使用したローポリ メッシュと比較すると、150 万個の三角ポリゴンで構成される Nanite メッシュは、サイズがより小さいながらも見かけがよりきれいになります。
Nanite が有効なメッシュとそのテクスチャの圧縮パッケージ サイズの合計は 27.83MB です。
テクスチャの解像度と詳細な法線マップで実施できる実験はたくさんありますが、この比較が示しているのは、 Nanite メッシュのデータ サイズが、アーティストがすでに慣れているデータとあまり変わらないということです。
最後に、ハイポリを使って Nanite 圧縮を標準的なスタティック メッシュ形式と比較できます。LOD0 ではどちらも同じです。
ハイポリ・スタティックメッシュ
スタティックメッシュ圧縮パッケージのサイズ: 148.95MB |
Nanite メッシュ
スタティックメッシュ圧縮パッケージのサイズ: 19.64MB |
先述の Nanite 圧縮と比較すると、そのサイズは 19.64MB であり、4 つの LOD を持つ標準的なスタティック メッシュの圧縮の 7.6 分の 1 です。
Nanite 圧縮とデータ サイズは、Unreal Engine の将来のリリースで改善予定の重要な要素です。
データ サイズに関する全般的な推奨事項
Nanite と 仮想テクスチャリング システムを高速 SSD と組み合わせて使用することで、ジオメトリとテクスチャのランタイム割り当てに関する問題を軽減できます。その上で、最大のボトルネックはこのデータを顧客に提供する方法です。
ディスク上のデータサイズは、コンテンツの配信方法、例えば物理的なメディア経由なのか、インターネット経由でダウンロードさせるのか (ただし圧縮技術には限界があります) などを検討する際の重要な要素です。平均的なエンド ユーザーのインターネット帯域幅、光学メディアの容量、およびハード ドライブの容量は、ハード ドライブの帯域幅やアクセス レイテンシー、GPU のコンピューティング パワー、Nanite などのソフトウェア テクノロジーに対応できるほどには進歩していないことがデータをユーザーに配信することを困難にしています。
Nanite にとって、高精細メッシュのレンダリングは大きな問題ではありません。 しかし、Unreal Engine 5 Early Access Edition に関する限り、ハード ドライブにデータを保存する方法はまだ改善が必要な領域です。
ビジュアライゼーション モード
Nanite は、進行中のシーン内でデータを検査するためのビジュアライゼーション モードを多数備えています。
レベル ビューポートの [View Modes (表示モード)] ドロップダウンから [Nanite Visualization (Nanite ビジュアライゼーション)] にカーソルを合わせて、目的のモードを選択します。
[Overview (概要)] ビジュアライゼーションを選択すると、レンダリングされたシーンが画像の中央に、選択した Nanite ビジュアライゼーションが参照用に画面の周囲に表示されます。
次の Nanite ビジュアライゼーション モードから選択できます。
Nanite ビジュアライゼーション |
説明 |
---|---|
Mask |
Nanite ジオメトリを緑色で、非 Nanite ジオメトリを赤色でマーキングします。 |
Triangles |
現在のシーン内にある Nanite メッシュのすべての三角ポリゴンを表示します。 |
Clusters |
現在のシーン ビューにレンダリングされているすべての三角ポリゴン グループを色付きで表示します。 |
Primitives |
インスタンス スタティック メッシュ (ISM) のすべてのインスタンスについて、コンポーネントをすべて同じ色で色付けします。 |
Instances |
シーン内のインスタンスをそれぞれ異なる色でペイントします。 |
Overdraw |
シーンのジオメトリで発生しているオーバードローの数を表示します。密に積み上げられた小さいオブジェクトは、大きなオブジェクトよりもオーバードローを発生させます。 |
Material Complexity |
Nanite ジオメトリのマテリアルの複雑さを表示します。 |
Material ID |
各 Nanite メッシュのマテリアル ID を色分けして表示します。 |
Lightmap UV |
Nanite メッシュ サーフェスの UV 座標を表示します。 |
Nanite には、[Nanite Visualization] メニューで追加のビジュアライゼーション モードを有効にする 高度な ビジュアライゼーション モードがあります。これらの追加のビジュアライゼーションは、プログラマーが Nanite のさまざまな基礎となるコンテンツをデバッグまたは分析する際に役立ちます。
この高度なビジュアライゼーション モードを有効にするには、r.Nanite.Visualize.Advanced 1
コンソール変数を使用します。
Nanite コンテンツを監査する
Unreal Engine の一部の機能はまだ Nanite でサポートされていません。また、今後もサポートされない機能もあります。Nanite ツール により、Nanite をサポートするアセットに対する監査を一つのウィンドウ内で実行できます。アセットで Nanite を有効/無効にすることで、コンテンツ ブラウザ内でアセットを監査してエラーや最適化の機会を見つけることができます。
[Tools (ツール)] > [Nanite Tools (Nanite ツール)] を選択して、メイン メニューから [Nanite Tools] ウィンドウを開きます。
Nanite でエラーとなるスタティック メッシュが表示された [Nanite Tools] ウィンドウ。
[Nanite Tools] ウィンドウには次の 2 つのタブがあります。
[Errors (エラー)] タブ:Nanite でエラーが発生することがすでにわかっている Nanite 有効のアセットを表示します。Nanite をサポートしないマテリアルが適用されているマテリアルなどです。
[Optimize (最適化)] タブ:含まれる三角ポリゴンの数や、サポートされていないマテリアルを使用するアセットを除外するかどうかに基づいて、プロジェクト内の Nanite 有効なアセットをフィルタリングして表示します。
エラーまたは最適化に対する Nanite の処理を評価するには、それぞれについて監査を実行する必要があります。
Nanite ツール:エラー
[Errors] タブは、Nanite 有効なアセットに適用されている、サポートされていないマテリアル タイプをすばやく特定する際に役立ちます。バッチ選択の方法を使用するなど、Nanite を使用するようにプロジェクトを変換するプロジェクトでは、[Error] タブには監査の実行後にサポートされない Nanite アセットが表示されます。
プロジェクトに含まれる Nanite 有効なアセットの監査を開始するには、[Perform Audit (監査を実行)] ボタンをクリックします。
監査時には、[Material Errors (マテリアル エラー)] に表示される、Nanite アセット上で有効になっているマテリアルにより、対象のアセットで検出されたエラーが生成されます。
この [Nanite Mesh Errors (Nanite メッシュ エラー)] リストには、問題のあるアセットの名前、それに含まれる三角ポリゴンの数、レベル内で使用されているインスタンスの数、それが原因で生成されるエラーの数が表示されます。
このリストを基に、Nanite を有効にしたままにするか、選択したものを、ウィンドウの右下にある [Disable Nanite (Nanite を無効化)] ボタンを使って一括で無効にするかを判断できます。
Nanite ツール:最適化
[Optimize] タブは、指定した三角ポリゴンの数に縛られず、Nanite が現在有効でない非サポートのマテリアル タイプの一つを使用していない Nanite サポート アセットをすばやく特定する際に役立ちます。
デフォルト値よりも少ない数の三角ポリゴンを含むアセットを変換する必要がある場合は、監査を実行する前に、[Geometry Filters (ジオメトリ フィルタ)] の [Triangle Threshold (三角ポリゴンしきい値)] を設定することを検討してください。
[Perform Audit] をクリックして、Nanite が有効になっていないアセットに対するプロジェクト監査を開始します。
フィルタの条件を満たす非 Nanite アセットが [Non-Nanite Meshes (非 Nanite メッシュ)] リストに表示されます。
リスト内のアセットに対して Nanite を有効にするには、その [Enable Nanite] をクリックします。
コンソール変数とコマンド
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 によって画面に表示される統計情報を指定するには、コマンド引数を使用します。引数を指定しない場合はプライマリ ビューが使用されます。
Nanitestats List
を使用すると、利用可能なすべてのビューがデバッグ出力に表示されます。
Primary
VSM_Directional
VSM_Perspective
ShadowAtlas0
ShadowAtlas1
ShadowAtlas2
ビューを選択するには、このコマンドに続けて目的の引数を入力します。たとえば、「Nanitestats VSM_Directional
」と入力してその統計情報を表示します。
2 パス オクルージョン カリングを使用するビューの場合、統計情報は Main と Post パスに分割されます。
Nanite ストリーミング プールのサイズを制御する
r.Nanite.Streaming.StreamingPoolSize
コンソール変数を使用して、Nanite ストリーミング データの保存に使用するメモリ量を指定できます。メモリ プールを大きく設定すると、シーン内を移動するときの IO と圧縮解除のワークロードが軽減されますが、メモリ使用量は増加します。
メモリ プールがビューに必要なすべてのデータを収容するのに十分な大きさでない場合は、「キャッシュ スラッシュ」が発生する可能性があります。この場合、静的ビューであってもストリーミングが不安定のままとなります。
このコンソール変数はランタイム時には変更できず、コンフィグ ファイル (.ini) で指定する必要があります。
単一パスの最大クラスタ数を設定する
r.Nanite.MaxCandidateClusters
と r.Nanite.MaxVisibleClusters
コンソール変数を使用すると、単一パスで使用される候補クラスタと可視クラスタの最大数をそれぞれ指定できます。それらの値は中間バッファのサイズ設定に使用されます。また、それらのデフォルト値には、一般的なレンダリング シナリオで機能する値が指定されています。
これらのバッファのいずれかを動的にサイズ変更したり、オーバーフロー時に品質を自動的に低下させたりするためのメカニズムは存在しないため、これらからのアーティファクトのレンダリングがシーンの複雑さに対応できないほど小さくなり、通常はジオメトリの欠落またはちらつきとして現れます。このようなアーティファクトが発生する場合は、Nanitestats
を使って候補クラスタと可視クラスタの安全な値を判断します。具体的には、ClustersSW と ClustersHW の統計情報を参照してください。現在、候補クラスタのメモリ コストは 12 バイトで、可視クラスタは 16 バイトです。
このコンソール変数はランタイム時には変更できず、コンフィグ ファイル (.ini) で指定する必要があります。