Nanite は Unreal Engine の仮想化ジオメトリ システムです。新しい内部メッシュ フォーマットとレンダリング テクノロジーを活用して、ピクセル スケールのディテールと多数のオブジェクトをレンダリングします。 人が知覚できるディテールだけをインテリジェントに処理し、それ以上は行いません。 Nanite のデータ形式は高度に圧縮され、きめ細かいストリーミングと自動詳細度 (LOD) をサポートします。
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) の利用が特に有効です。 詳細については、「派生データ キャッシュ (DDC)」ドキュメントを参照してください。
メッシュをインポートする
Nanite の使用を目的としたメッシュをインポートする場合は、[Build Nanite (Nanite をビルド)] チェックボックスをオンにします。
Lightmass で事前計算されたライティングを使用しない場合は、[Generate Lightmap UVs (ライトマップ UV の作成)] プロパティを無効にすることをお勧めします。
有効にすると、非常に詳細なジオメトリにより、スタティックメッシュ データのインポートと構築にかなりの時間がかかります。 また、このプロパティにより、高密度なメッシュ用の膨大な量のデータを含む UV チャンネルがさらに追加されます。 プロジェクトでベイク処理したライティングが必要でなければ、このような追加コストを抱える必要はありません。
アセットで Nanite を有効にする
Nanite を使用するコンテンツがすでにプロジェクトに取り込まれている場合は、コンテンツ ブラウザを使用してバッチでアセットを有効化する、あるいは、各自でエディタを使用して個々のアセットを有効化するという 2 つのオプションがあります。
メッシュで 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 による剛体メッシュの変形のサポートは限定的です。 Nanite は、動的か静的かにかかわらず、このメッシュの動的な移動、回転、および不均一なスケーリングをサポートします。 これは、メッシュ全体に一様に適用される単一の 4x3 マトリックス乗算で表現できるよりも複雑な方法で、Nanite メッシュの任意の位置を移動することを意味します。
変形は、以下で限定されています。
(ベータ) マテリアルのワールド位置オフセット (WPO)
この設定は、Nanite メッシュが小さなクラスタに分割されて、そのクラスタが個々の境界を持ち、GPU 上で個別にカリングされるので、WPO ディスプレースメントを使用する Nanite メッシュには特に便利です。 カリングされる Nanite メッシュのクラスタの数を管理するには、WPO をクランプします。
フォリッジは穴で満たされていて実質的に自身をオクルードできないため、WPO を使用したフォリッジでは問題が発生しにくくなります。
変形は、以下でサポートされていません。
モーフ ターゲット
シーンに存在可能なインスタンスの最大数は 1600 万インスタンスに固定されています。これには、Nanite の使用が有効になっているものだけでなく、ストリーミングで入力されるすべてのインスタンスが含まれます。 ストリーミングで入力されるインスタンスのみが合計にカウントされます。
Nanite が有効になっている場合、頂点ごとの接線はスタティックメッシュから格納されません。 代わりに、タンジェント空間がピクセル シェーダーで暗黙的に派生します。 データ サイズを小さくするために、接線データは格納されません。 このアプローチを使用した際にタンジェント空間に生じる差異により、エッジ部分で不連続性が発生する場合があります。 ただし、この特定の問題が深刻になることは確認されておらず、頂点接線は今後のリリースでサポートされる予定です。
マテリアル
Nanite は、ブレンド モードが Opaque (不透明) および Masked (マスク) に設定されているマテリアルをサポートします。 サポートされないマテリアル タイプが検出されると、Nanite が有効なメッシュにデフォルトのマテリアルが割り当てられて、出力ログに追加の情報とともに警告が表示されます。
マテリアルの機能に関する追加の注記:
Nanite が有効なメッシュは、そのサーフェスに投影されたデカールを受け取る場合がありますが、メッシュ デカールはサポートされません。このメッシュ デカールでは、マテリアルで Translucent (透過) ブレンド モードが使用されている必要があります。
[Wireframe (ワイヤーフレーム)] チェックボックスはサポートされていません。
Vertex Interpolator ノードとカスタム UV はサポートされていますが、ピクセルあたり 3 回評価されます。
Custom 式ノード、またはこれらを使用するすべてのノード (
ParallaxOcclusionMappingマテリアル関数など) を Nanite と使うとアーティファクトが発生する場合があります。 Nanite はまだ解析派生対応をしていないので、これは想定内です。
レンダリング
次のレンダリング機能は現在サポートされていません。
以下を使用する、オブジェクトのビュー特有のフィルタリング
画面の最小半径
距離カリング
フォワード レンダリング
VR のステレオ レンダリング
分割画面
マルチサンプル アンチエイリアス (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)
Apple シリコン M2 以降
NVIDIA GeForce 2080 以降を搭載した Linux
最新のグラフィック ドライバー
PlayStation 4 と Xbox One でも Nanite はサポートされますが、これらのプラットフォームに対するサポートは現在実験段階にあります。 これらのプラットフォーム上における忠実性の高いコンテンツでの Nanite のパフォーマンスは、シッピング用ゲームの要件を満たさない可能性があることが予想されます。
Epic Games で推奨されるハードウェアおよびソフトウェアの仕様の詳細については、「ハードウェアおよびソフトウェアの仕様」を参照してください。
Nanite のフォールバック メッシュと精度の設定
スタティックメッシュおよびスケルタルメッシュには、Nanite の表現の精度を制御する追加のプロパティと、完全に詳細なメッシュから生成されたフォールバック メッシュが含まれます。
これらの設定は、メッシュ エディタの [Details] パネルにある [Nanite Settings] セクションにあります。
[Nanite Settings] には次のプロパティが含まれます。
| プロパティ | 説明 |
|---|---|
Enable Nanite Support | このメッシュが Nanite で使用されるのを有効にし、Nanite を使用できない状況ではフォールバック メッシュを生成できるようにします。 |
Preserve Area | 簡素化によってサーフェス領域が失われる Nanite メッシュで、開放境界エッジを拡張し、失われた領域を残りのトライアングルに再分配できるようにします。 これは、簡素化によって葉が離れたトライアングルやクワッドになりがちなフォリッジを対象とする場合に最も役立ちます。 この設定には、それぞれの葉がスケール アップされる効果があります。 草の葉など、ジオメトリ リボンの場合は、厚みが増すという効果があります。 この設定は、すべてのフォリッジのメッシュで有効にし、それ以外では有効にしないでください。 |
Explicit Tangents | true の場合、アセットごとに元のモデル接線を格納して使用します。 この設定は、ランタイム時に暗黙的に導出された接線を使用する代わりに、ディスク上に接線を明示的に保存することを意味します。 接線の精度設定は、頂点接線の追加制御で使用可能になります。 この設定を有効にすると、約 10% ストレージが増加しますが、暗黙的な接線が十分に正確でない場合に望ましいことがあります。 |
Lerp UVs | 単純化するときに UV を補間するかどうか。 可能な場合は有効にしてください。 実 UV 座標の場合、単純化する際に新しい頂点に対して最もエラーの少ない最適な UV を計算することができます。その際、UV が法線テクスチャ座標として使用され、三角ポリゴンの面全体で補間されると仮定します。 UV に格納されているデータが補間に使用できない場合は無効にしてください。 たとえば、インデックスが UV に格納されている場合です。 インデックスの線形補間は意味がなく、それを使おうとするシェーダーが壊れてしまいます。 無効にすると、Nanite がレンダリングする LOD を選択する際、UV によるエラーが考慮されなくなります。補間できない任意の頂点属性によるエラーは、一般的には推論できないためです。 |
Position Precision | Nanite メッシュの頂点の位置の生成時にメッシュで使用する精度を選択します。 [Auto (自動)] に設定すると、メッシュのサイズに基づいて適切な精度が選択されます。 精度は、精度の向上やディスク容量の最適化のためにオーバーライドすることができます。 |
Normal Precision | Nanite メッシュの頂点の法線の生成時にメッシュで使用する精度を選択します。 [Auto (自動)] に設定すると、メッシュのサイズに基づいて適切な精度が選択されます。 精度は、精度の向上やディスク容量の最適化のためにオーバーライドすることができます。 |
Minimum Residency (Root Geometry) | メッシュで常にメモリ内に維持するメモリ バイト サイズを設定します。残りはストリーミングされます。 これを高く設定するとより多くのメモリが必要になりますが、一部のメッシュではストリーミングが頻発する問題が軽減されます。 |
Keep Triangle Percent | ソース メッシュから維持する三角ポリゴンの比率です。 ディスク容量を最適化するにはこの比率を下げます。 |
Trim Relative Error | Nanite メッシュからの削除が可能な相対誤差の最大値を設定します。 この相対誤差の値よりもビジュアル面の影響が少ないソース メッシュのすべての詳細が削除されます。 相対誤差に単位サイズはありません。また、相対誤差はメッシュのサイズを基準としています。 Nanite は、デフォルトで元のソース メッシュの三角ポリゴンをすべて格納します。 |
Fallback Target | フォールバック メッシュを生成するときに使用するターゲティング システムを決定します。 Auto (自動):プロジェクト設定に基づいてフォールバック メッシュを自動で作成します。 Fallback Triangle Percent (フォールバックの三角ポリゴン比率):Nanite のソース メッシュを削減する際に維持する三角形比率を設定します。 Fallback Relative Error (フォールバックの相対誤差):メッシュのサイズを基準として、指定誤差に達するまで減らします。 この相対誤差の値よりもビジュアル面の影響が少ない生成済みのフォールバック メッシュのすべての詳細が削除されます。 |
Source Import Filename | Nanite で使用する高解像度メッシュをインポートするために使用されるファイル パス。 より詳細なジオメトリの恩恵を受けることのできるシステム (Unreal Engine の Nanite やジオメトリ モデリングなど) によって LOD0 の代わりに高解像度バージョンのメッシュが使用されます。 |
Displacement UV Channel | ディスプレイスメント マップのサンプリング時に使用する UV チャンネル。 |
Displacement Maps | ディスプレイスメント マップを追加および編集します。 |
Max Edge Length Factor | 画面上のメッシュの各頂点間の距離のうち許容される最大値を制御します。 これを使用すると、ワールド位置オフセットを使用したアニメーションやスプライン メッシュなど、変形することを意図したメッシュの過度な単純化を防ぐことができます。 過度な単純化によって発生する問題を修正するために明示的に必要な場合を除き、デフォルトでは 0 のままにしておく必要があります。 |
頂点精度
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 のレンダリングがサポートされない場合に、フォールバック メッシュが使用されます。 また、フォールバック メッシュは、複雑なコリジョンが必要な場合や、ベイク処理されたライティングにライトマップを使用する必要がある場合、さらには 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 が有効なコンテンツで作業する
ほとんどの場合、Nanite は画面の解像度で非常にうまくスケーリングされます。 これは、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 のスケーリングの効果が低下します。
ファセット法線とハードエッジ法線
留意すべき問題として、ファセット法線を含む高精細のメッシュをインポートする際には、2 つのポリゴン間にある法線が平滑化されていないという点があります。 これは一般的な問題ですが見落としやすく、メッシュで少量の頂点を共有すると、レンダリング パフォーマンスとデータ サイズの両方のコストが大幅に高くなるため、この特定の問題に注意する必要があります。 メッシュの頂点の数を、それに含まれる三角ポリゴンの数よりも少なくすることが理想的です。 この比率が 2:1 以上の場合、特に結果として三角ポリゴンの数が多くなる場合は、問題が発生する可能性が高くなります。 比率が 3:1 になるとメッシュは完全にファセットとなります。この場合、各三角ポリゴンには 3 つの個別の頂点が含まれますが、どの頂点も他の三角ポリゴンとは共有されません。 ほとんどの場合、法線が平滑化されないため、これらが同じにならないことが原因です。
これを念頭に、より多くの頂点によって格納するデータが増えることに留意してください。 また、これはより多くの頂点変換作業を意味し、2:1 よりも高い比率では遅いレンダリング パスになります。 ハード サーフェス モデリングでの意図的な使用には問題はなく、使用しない理由もありません。 ただし、100% ファセットの密集したメッシュは、予想よりもはるかにコストが高くなります。 また、別の注意点として、他の DCC パッケージで生成された密度の高い有機タイプのサーフェス上にインポートされた法線は、低いポリゴン メッシュで認識される可能性のあるハード法線しきい値を備えていますが、これによって Nanite で不要なコストが発生する可能性があります。
たとえば、下の 2 つのメッシュでは、左のものにはファセット法線があり、右のものには平滑化された法線があります。 Nanite のトライアングル ビジュアライゼーションを使ってこれらを比較すると、Nanite によって描画に使用される三角形の数に大きな違いがあることがわかります。 左のファセット法線には、右の平滑化された法線よりもはるかに多い数の三角ポリゴンが描画されています。
ファセット法線を含む Nanite 有効なメッシュ (左) と、平滑化された法線を含む Nanite 有効なメッシュ (右) | ファセット法線を含む Nanite 有効なメッシュの Nanite トライアングル ビジュアライゼーション (左) と、平滑化された法線を含む Nanite 有効なメッシュの Nanite トライアングル ビジュアライゼーション (右) |
画像をクリックするとフル サイズで表示されます。 | 画像をクリックするとフル サイズで表示されます。 |
Nanite スケルタルメッシュ
これは現在、実験段階の Nanite の機能です。
Nanite スケルタルメッシュには、次のサポートが含まれています。
レンダリングを簡単に実現する新しいスケルタルメッシュ API。
メッシュ全体に対して 1 回のドロー コール。
仮想シャドウ マップからのシャドウイング。
ジオメトリ LOD なし。 Nanite スケルタルメッシュはアニメーション LOD を使用します。
アニメーション バンクを使用したインスタンス化。
Nanite を使用するフォリッジ
Nanite を使用するフォリッジは、ベータとしてみなされており、積極的な研究および開発を行っています。 このセクションでは、Nanite でフォリッジを活用するためのいくつかのガイダンスを提供します。
デフォルトの Nanite 設定を使用した木々などのアセットでは、林冠が距離とともに薄くなって見える場合があります。 こうしたケースは、集合ジオメトリに特有の形式であり、切り離されたそれぞれの部分 (葉や草) で境界が開放エッジになっています。 Nanite が有効な場合にこのように薄くなることを防ぐには、[Preserve Area (エリアを保持)] の有効化が役立ちます。 三角ポリゴンを減らすことで Nanite によって遠方のジオメトリが簡素化される場合、最終的にはこれらの切り離された要素のいくつかを完全に削除する必要があります。 Nanite の詳細な情報がない場合、大きなサーフェス領域の損失があるため、結果として薄くなって見えます。 [Preserve Area (エリアを保持)] は、開放境界エッジを拡張し、その失われた領域を残りのトライアングルに再分配できるようにします。 葉などの対称的な形状を拡張すると、スケール アップと同じ効果があります。 草の葉など、非対称のリボンの場合は、厚みが増すという効果があります。
[Preserve Area] はすべてのフォリッジ メッシュに推奨されるものですが、シーン フォリッジとして使用が想定されていないメッシュには推奨されません。
Nanite クラスタ ビジュアライゼーションでは、失われた領域が [Preserve Area] によって再分配される方法をよりわかりやすく確認できます。
Nanite での使用を想定し、フォリッジ アセットを使用およびオーサリングする場合の推奨事項を以下に説明します。 これは、現在も実験中の取り組みであり、最適なアプローチを調査しています。 ここまでで、Nanite を使用するフォリッジは以前とは異なる方法でオーサリングしなければならないことを確認しましたが、その強みを活用すると、Nanite を利用してより高速かつ高品質な結果を得ることができます。
[Preserve Area] (スタティックメッシュ エディタで有効にする) を使用します。
マスク付カードではなく、ジオメトリを使用します。
マスク付マテリアルは、不透明型マテリアルと比べて負荷がかなり大きくなります。 これらをまったく使用しないようにすると、最も高速な結果が得やすくなります。
Nanite を使用した従来のカード アプローチ (多数の要素が単一のカードで表現される) は、Nanite を使用しない場合よりも低速になる場合があります。 カードベースのフォリッジで Nanite を有効にすることが、常にパフォーマンス改善になると期待しないでください。
マスクされたピクセルの負荷は、描画されるピクセル数のものとほぼ同等になります。
ジオメトリ フォリッジは、カード アプローチ (Nanite を使用したカードと Nanite を使用しないカードの両方) よりも、Nanite を使用するとより高速になることが判明しています。 また、表示も向上します。
Fab の メガスキャン:草パックには、テスト用の優れたサンプルが用意されています。 このパックには、マスクされたジオメトリと高ポリゴンのジオメトリが用意されており、各要素は独立していて、マスクされた低ポリゴンのカード (多くの要素が単一のカードで表現される) になっています。
ワールド位置オフセット (WPO) を使用すると、より多くの頂点の負荷が高くなります。 WPO ロジックは制限し、監視する必要があります。
このページの「集合ジオメトリ」セクションで説明した問題は、引き続き該当します。 密度が高い森 (上の例のようなもの) では、すべてのメッシュを同じ三角ポリゴン数のソリッド形状で置き換えた同じシーンよりもレンダリングがはるかに低速になります。
Max World Position Offset Displacement (ワールド位置オフセットの最大ディスプレースメント) を Nanite で使用する
マテリアルとマテリアル インスタンスでは、Max World Position Offset Displacement 設定を使用して、WPO が持ちうるオフセット量の上限を設定することができます。 この設定は、Nanite メッシュが小さなクラスタに分割されて、そのクラスタが個々の境界を持ち、GPU 上で個別にカリングされるので Nanite メッシュには特に便利です。 WPO のクランプは、これを管理する優れた方法です。
Max World Position Offset Displacement 設定は、マテリアルの [Details] > [World Position Offset (ワールド位置オフセット)] カテゴリ、またはマテリアル インスタンスの [Material Property Overrides (マテリアル プロパティのオーバーライド)] の中にあります。
詳細については、「マテリアルのプロパティ」を参照してください。
Nanite スタティック ディスプレイスメント マッピング
これは現在、実験段階の Nanite の機能です。
スタティックメッシュ エディタには、オフラインのアダプティブ テッセレータによって Nanite を有効にしたメッシュにディテールを追加するオプションがあります。 テッセレータはディスプレイスメント マップをベイクすることで最適化された Nanite メッシュを生成します。 テクスチャ主導型のこのアプローチは非破壊的であり、テッセレーションやディスプレイスメントの量をスカラー パラメータで制御することができます。
[Details (詳細)] パネルの [Nanite Settings (Nanite 設定)] で以下の操作を行います。
[Trim Relative Error (相対誤差をトリミング)] を 0 以外の値に設定して、テッセレーション量を制御します。
デフォルトは 0.04 が適切ですが、0.02 より上に保つ必要があります。 これは、メッシュにテッセレーションを行う時のエラー レベルの目標値です。 値が低すぎると、単純に三角ポリゴンを多数使用することになり、ビルド時間が長くなります。
[Displacement Maps (ディスプレイスメント マップ)] を追加します。
[Index (インデックス)] 要素を展開し、ディスプレイスメントに使用するテクスチャを追加します。
メッシュに複数のマテリアル スロットがある場合、それぞれのディスプレイスメント マップ インデックスは対応するマテリアル スロットにマッピングされます。 たとえば、マテリアル スロット 0 は Displacement Maps Index 0、マテリアル スロット 1 は Index 1 というようにマップします。
[Magnitude (マグニチュード)] を設定してディスプレイスメント量を制御します。
[Apply Changes (変更を適用)] をクリックします。
Nanite テッセレーション
これは現在、実験段階の Nanite の機能です。
Nanite テッセレーションは動的にプログラム可能なディスプレイスメントであり、ディスプレイスメント マップまたはプロシージャル マテリアルを使用して実行時に Nanite メッシュを変更できます。 これは元のメッシュ頂点に対してのみ操作できるワールド位置オフセットとは異なり、Nanite ディスプレイスメントは、実行時にメッシュを追加の三角ポリゴンにテッセレーションして、ディスプレイスメント マップの詳細に適合させます。 現在のピクセル密度に必要な三角ポリゴンのディテールだけが生成されます。
Nanite テッセレーションの利点は次のとおりです。
オーサリング パイプラインで詳細度の低いソース メッシュを使用可能。
マテリアル主導かつアニメートしたディスプレイスメントを使用可能。
詳細な Nanite のランドスケープを作成可能。
画像をクリックすると拡大表示されます。
Nanite テッセレーションを有効にするには、次のコンソール変数を ConsoleVariables.ini または使用プロジェクトの .iniコンフィギュレーション ファイルに設定する必要があります。
// This is read-only and must be set in the config file for the project.
r.Nanite.AllowTessellation=1
// This can be dynamically toggled at runtime.
r.Nanite.Tessellation=1これらの変数を設定したら、次の手順に従ってマテリアル エディタを使用してテッセレーションを設定できます。
メインとなるマテリアル ノードを選択します。
[Details] パネルの [Nanite] 設定で、[Enable Tessellation (テッセレーションを有効化)] のチェックボックスをオンにします。
Texture Sample をメインのマテリアル ノードの Displacement 入力に接続します。
Displacement 入力の値の範囲は、0 ~ 1 です。
マテリアルのテッセレーションを使用する場合、2 つの設定があります。
Magnitude (マグニチュード):Displacement ピンの 0 から 1 の範囲をマップする最小から最大までの測定ディスプレイスメントの高さです。 また、カリングに使用される境界も決定するため、必要なだけ大きく設定します。
この値はパフォーマンスに大きな影響を与え、その他の予期しない影響が生じる可能性があります。 詳細については、後述の「重要事項」セクションを参照してください。
Center (中央):ベース メッシュからの変化がない場合に対応するディスプレイスメント値を指定します。 したがって、ミドル グレーが中心で、メッシュの内側と外側の両方でディスプレイスメントを均等にしたい場合は、0.5 を使用します。 外側にのみ押し出す場合は、これを 0 に設定します。
さらに、マテリアルでは、[Details] パネルで [Displacement Fade (ディスプレイスメント フェード)] を有効にして Nanite テッセレーションを最適化できます。 これには 2 つの設定があります。
Start Fade Size (Pixels) (開始フェード サイズ (ピクセル)):ディスプレイスメントのフェード アウトが開始したときに、画面でのピクセル単位で最大ディスプレイスメントがどの程度かを示します。 この値には [End Fade Size (終了フェード サイズ)] より大きい 数値が必要です。
End Fade Size (Pixels) (終了フェードサイズ (ピクセル)):画面でのピクセル単位で最大ディスプレイスメントがどの程度かを示します。フェード アウトが完了すると、ディスプレイスメントは無効になります。 この値には [Start Fade Size] よりも小さい数値を指定してください。
重要事項:
Nanite メッシュでのみ機能します。 テッセレーションとディスプレイスメントは、Nanite 以外のメッシュまたは Nanite がサポートされていない場合に無視されます。
ディスプレイスメントはシェーディングを変更しません (オフライン レンダラとは異なります)。 対応する法線マップを提供するか、ディスプレイスメント導関数から法線を導出する必要があります。 品質と圧縮のために、追加の法線マップを用意することをお勧めします。
スカラー ディスプレイスメントのみ使用できます。 ベクター ディスプレイスメントは現在サポートされていません。
ディスプレイスメントは、正規化されていない補間された頂点法線に沿っています。 現在、シェーダーでディスプレイスメントの方向を制御するオプションはありません。 方向は、常に法線に沿っています。
ディスプレイスメントはローカル空間にあり、あらゆる種類のオブジェクト スケールの前にあります。 つまり、マテリアルで指定されたディスプレイスメントのマグニチュードは、メッシュのスケーリング前のオブジェクト空間単位です。 これは望ましい場合もありますが、そうでない場合もあります。 たとえば、壁になるようにスケーリングした立方体の上にタイル化されたレンガを配置したい場合などです。 これらのケースに対処するために、今後はワールド空間のオプションを追加する予定です。
テッセレーションとディスプレイスメントは、Nanite が生成されていれば、ランドスケープでも機能します。 残念ながら、ランドスケープが生成するメッシュには、自動的に大きなスケールが適用されるため、ランドスケープ マテリアルには、はるかに小さいマグニチュードを使用するようにしてください。 たとえば、64x より小さくします。 これは、前述のポイントで説明したオプションを使用して、今後対処される可能性があります。
マグニチュード設定の値は、必要最低限に抑えてください。 代わりに、ディスプレイスメント出力の 0 ~ 1 の範囲全体を使用するようにします。 マグニチュードを 100 に設定し、補正のためにディスプレイスメント出力に差し込む値を小さくしないでください。 マグニチュード値がカリングのパッチに境界を付けるために使用されるためです。 マグニチュードが大きいと、特に仮想シャドウ マップでパフォーマンスに重大な影響を与える可能性があります。
現在、Unreal Engine 4 のハードウェア テッセレーションのような、ひび割れのないディスプレイスメントのソリューションはありません。 つまり、UV シーム、ハード エッジ法線、または滑らかでないディスプレイスメントに影響する頂点属性は、ひび割れの原因になります。
テッセレーションは、ワールド位置オフセットと組み合わせることができます。 この場合、WPO は、テッセレーションの前にベース メッシュの頂点に適用されます。 ディスプレイスメントは、いつものように、テッセレーション後にダイス形の三角ポリゴンの頂点に適用されます。
テッセレーションはピクセル深度オフセットと互換性がありません。 テッセレーションが有効になっている場合、PDO は無視されます。
テッセレーションはオパシティ マスクと組み合わせることができますが、パフォーマンス上の理由から、マスキングはピクセルごとではなく、ダイス形の三角ポリゴンのレートで行われます。 ほとんどのユースケースではこれで問題ありませんが、ディザリングではうまく機能しません。ディザリングは実際にはピクセルごとに行う必要があるためです。
ディスプレイスメント マップではテクスチャ圧縮アーティファクトが顕著になり、階段状のステップのように見える可能性があります。 BC4 を使用するテクスチャ圧縮設定アルファは、多くの場合適切に機能します。 デフォルト/DXT5/BC3 で RGBA のアルファに保存すると、同様の結果が得られます。 非圧縮が必要な場合もありますが、浮動小数点は行き過ぎになる可能性があります。 圧縮形式でのチャンネル パッキング、特に法線による高さのパッキングでは、アーティファクトが発生する可能性があります。 これは、高さマップが他の目的で使用されていた以前のエクスペリエンスの反対になる可能性があります。
ディスプレイスメントは、ベース メッシュの平面三角ポリゴンを基準としています。 つまり、PN 三角ポリゴンや Catmull-Clark サブディビジョン サーフェスのような曲面から開始されるわけではありません。 テッセレーションは、本質的にサーフェスを滑らかにするものではありません。
Nanite スプライン
スプライン メッシュは、たとえばランドスケープ テレイン上の道路および小道など、スプラインの形状に沿ってメッシュを変形する際に使用されます。 Nanite が有効なメッシュは、デフォルトでスプラインをサポートしており、ランドスケープ スプラインおよびブループリント スプラインとして作成できます。
前景に Nanite メッシュがある Nanite スプラインのサンプル シーン。 このシーンは、ライティングがある Nanite トライアングルのビジュアライゼーションを示します。
Nanite スプライン メッシュには、視覚的な問題が発生する可能性があります。 その 1 つは、Nanite を有効にしたスタティックメッシュを使用してスプライン メッシュを作成する場合、カメラがスプライン メッシュから離れるにつれて、スプライン メッシュの解像度が低下する可能性があることです。 これは、Nanite が低い詳細度 (LOD) を生成するときにスプライン メッシュの変形を考慮しないために発生します。 その結果、変形されていない場合は同じ距離で目立たない単純化が、スプライン カーブに沿って引き伸ばされると明らかになることがあります。
この変形の問題は、スタティックメッシュ エディタの [Details] パネルの [Nanite Settings (Nanite 設定)] にある [Max Edge Length Factor (最大のエッジの長さ係数)] 設定で軽減できます。 このパラメータは、画面上のメッシュの頂点間の距離を必要な量に保つのに十分な詳細を Nanite に強制することでこの問題を軽減し、メッシュが頂点密度のしきい値を下回ってレンダリングされるのを防ぎます。
デフォルトの [Max Edge Length Factor] は 0 です。 このメッシュではエッジの長さが考慮されないことを示します。 0 より大きい値は、画面空間内の任意の 2 つの接続された頂点間の望ましい距離を表します。 具体的には、この距離は、必要な最小の Nanite 三角形のエッジ (r.Nanite.MaxPixelsPerEdge によって設定) の倍数として表されます。
以前のエンジン バージョンから Nanite スプラインにアップグレードする
Unreal Engine 5.3 以前で作成されたプロジェクトの場合、Nanite を有効にしたスタティックメッシュを使用するスプライン メッシュ コンポーネントは、以前は Nanite メッシュから生成されたフォールバック メッシュを通常のスタティックメッシュとしてレンダリングしていました。 Unreal Engine 5.4 では、Nanite を使用したスプラインのレンダリングがデフォルトで有効になったため、これらのメッシュは Nanite としてレンダリングされるようになり、視覚的な違いが生じる可能性があります。
Nanite のフォールバック メッシュをスプライン メッシュとしてレンダリングするという以前の動作を維持するには、r.SplineMesh.RenderNanite を 0 に設定します。
Nanite 以外のコンテンツと Nanite コンテンツのハイブリッド ワークフロー
次のセクションでは、Nanite を有効にしたプロジェクトで Nanite 以外の機能やプラットフォームもサポートする必要がある場合に、アセットを複製することなく利用できるワークフローを取り上げます。
Nanite 用に高解像度メッシュをインポートする
コンテンツ ブラウザまたはスタティックメッシュ エディタを使用して高解像度メッシュをインポートし、既存の Nanite 以外のスタティックメッシュを対象として Nanite 表現にすることができます。
コンテンツ ブラウザから、スタティックメッシュ アセットで右クリックのコンテキスト メニューを使用して [Level of Detail (詳細度)] > [High Res (高解像度)] > [Import High Res (高解像度をインポート)] を選択し、インポートするファイルに移動します。
または、スタティックメッシュ エディタを使用し、[Details] パネルの [Nanite] 設定から高解像度メッシュをインポートします。 [Import (インポート)] をクリックし、インポートするファイルに移動します。
このワークフローを使用すると、インポート プロセスで Nanite ジオメトリからフォールバック メッシュが自動で生成されるのではなく、既存のスタティックメッシュと詳細度 (LOD) チェーンがフォールバック メッシュになります。
このワークフローは、シーン内のスタティックメッシュ アクタで [Disallow Nanite (Nanite を禁止)] 設定を優先します。また、その詳細については、以下の「スタティックメッシュ コンポーネント オプション」セクションで説明しています。
マテリアル ワークフロー
マテリアルを使用する、Nanite 以外のワークフローと Nanite のワークフローを改善できる方法は 2 つあります。マテリアル グラフ内のノードを使用してロジック パスを分割する方法か、または Nanite を使用したレンダリングのみにオーバーライド マテリアルを使用する方法です。
Nanite Pass Switch ノード
Nanite Pass Switch ノードを使用すると、Nanite でレンダリングを行う場合に、マテリアル グラフ内の特殊な動作を定義できます。
Nanite を使用しないパスにレンダリングを行う場合は、デフォルトの入力を使用し、通常どおりにマテリアルが処理されるようにします。 Nanite の入力は、簡素化するマテリアル ロジックまたは Nanite パスに対して特殊なレンダリングを行うマテリアル ロジックに使用します。 たとえば、Nanite によってサポートされない機能がマテリアルで使用されている場合、同じロジックをデフォルトの入力では維持し、Nanite の入力ではより適合するロジックを使用できます。
Nanite Override Material
マテリアルとマテリアル インスタンスで「Nanite Override Material」スロットが利用できます。 オーバーライド マテリアルを設定した場合、マテリアルまたはマテリアル インスタンスが割り当てられた Nanite が有効なメッシュは、参照されている Nanite オーバーライド マテリアルを代わりに使用します。 これはつまり、Nanite Pass Switch ノードを使用してマテリアル グラフ内から直接ロジックを管理するのではなく、Nanite ワークフローに特定のマテリアルを作成できるということです。
このマテリアル インスタンスでは、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 でないアクタを混在させて使用できるということになります。
以下の例では、単一の Nanite が有効なスタティックメッシュ アセットを示します。ここで、左側は Nanite のメッシュ表現であり、右側は [Disallow Nanite] を有効にしたものです。
ランドスケープ テレイン
ランドスケープ アクタで Nanite を有効にできます。 Nanite ランドスケープ メッシュは、エディタ内のユーザーのワークフローを妨げないように、バックグラウンドで再ビルドされます。 Nanite ランドスケープはランドスケープの解像度を改善していませんが、ユーザーは GPU カリング、自動ジオメトリ ストリーミング、LOD などの Nanite ランタイム機能を利用できます。 これにより、特に VSM などの機能が必要な場合に、ランタイム パフォーマンスが向上します。
ランドスケープで Nanite を有効にして使用する方法の詳細については、「ランドスケープで Nanite を使用する」のドキュメントを参照してください。
一般的なコンテンツのパフォーマンス
比較のために、PlayStation 5 の 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 |
Normal | 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 にとって、高精細メッシュのレンダリングは大きな問題ではありません。しかし、ハード ドライブにデータを保存する方法はまだ改善が必要な領域です。
ビジュアライゼーション モード
Nanite は、進行中のシーン内でデータを検査するためのビジュアライゼーション モードを多数備えています。
レベル ビューポートの [View Modes (表示モード)] ドロップダウンから [Nanite Visualization (Nanite ビジュアライゼーション)] にカーソルを合わせて、目的のモードを選択します。
[Overview (概要)] ビジュアライゼーションを選択すると、レンダリングされたシーンが画像の中央に、選択した Nanite ビジュアライゼーションが参照用に画面の周囲に表示されます。
次の Nanite ビジュアライゼーション モードから選択できます。
| Nanite ビジュアライゼーション | 説明 |
|---|---|
Mask (マスク) | Nanite ジオメトリを緑色で、非 Nanite ジオメトリを赤色でマーキングします。 |
Triangles (三角形) | 現在のシーン内にある Nanite メッシュのすべての三角ポリゴンを表示します。 |
Patches (パッチ) | 現在のシーン内にある Nanite メッシュのすべてのパッチを表示します。 |
Clusters (クラスタ) | 現在のシーン ビューにレンダリングされているすべての三角ポリゴン グループを色付きで表示します。 |
Primitives (プリミティブ) | インスタンス スタティックメッシュ (ISM) のすべてのインスタンスについて、コンポーネントをすべて同じ色で色付けします。 |
Instances (インスタンス) | シーン内のインスタンスをそれぞれ異なる色でペイントします。 |
Overdraw (オーバードロー) | シーンのジオメトリで発生しているオーバードローの数を表示します。 マスキングされたピクセルを含む評価されたすべてのピクセルは、オーバードロー ビューに追加されます。 密に積み上げられた小さいオブジェクトは、大きなオブジェクトよりもオーバードローを発生させます。 |
Lightmap UV (ライトマップ UV) | Nanite メッシュ サーフェスの UV 座標を表示します。 |
Evaluate WPO (WPO を評価) | Nanite が有効なジオメトリを、ワールド位置オフセットを使用するもの (緑色) と使用しないもの (赤色) に色分けします。 |
Pixel Programmable (プログラム可能ピクセル) | |
Tessellation (テッセレーション) | テッセレーションを使用した Nanite メッシュのビジュアライゼーションと、テッセレーションされたメッシュでのみ発生するテッセレーションの量。 |
Raster Bins (ラスタ ビン) | ジオメトリのバッチを表すグループを表示します。 |
Shading Bins (シェーディング ビン) |
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 によって画面に表示される統計情報を指定するには、コマンド引数を使用します。 引数を指定しない場合はプライマリ ビューが使用されます。
NaniteStats List を使用すると、利用可能なすべてのビューがデバッグ出力に表示されます。
プライマリ
VirtualShadowMaps
利用可能な場合は、ShadowAtlas と CubemapShadows に利用できる他の統計情報も表示される場合があります。 このコマンドに続けて表示したい統計情報リストの名前を入力し、ビューを選択します。 たとえば、「NaniteStats VirtualShadowMaps」と入力します。
2 パス オクルージョン カリングを使用するビューの場合、統計情報は Main と Post パスに分割されます。
Nanite ストリーミング プールのサイズを変更する
r.Nanite.Streaming.StreamingPoolSize コンソール変数を使用して、Nanite ストリーミング データの保存のみに使用するメモリ量を指定できます。 メモリ プールを大きく設定すると、シーン内を移動するときの IO と圧縮解除のワークロードが軽減されますが、メモリ使用量は増加します。
メモリ プールがビューに必要なすべてのデータを収容するのに十分な大きさでない場合は、「キャッシュ スラッシュ」が発生する可能性があります。この場合、静的ビューであってもストリーミングが不安定のままとなります。
Nanite ストリーミング データを可視化するには、ストリーミング ジオメトリ表示フラグ ([Show (表示)] > [Nanite] > [Streaming Geometry (ストリーミングジオメトリ)]) を使用します。 無効にすると、Nanite メッシュは、メモリに常に存在している品質レベルでのみレンダリングされます。
単一パスの最大クラスタ数を設定する
r.Nanite.MaxCandidateClusters と r.Nanite.MaxVisibleClusters コンソール変数を使用すると、単一パスで使用される候補クラスタと可視クラスタの最大数をそれぞれ指定できます。 それらの値は中間バッファのサイズ設定に使用されます。また、それらのデフォルト値には、一般的なレンダリング シナリオで機能する値が指定されています。
これらのバッファのいずれかを動的にサイズ変更したり、オーバーフロー時に品質を自動的に低下させたりするためのメカニズムは存在しないため、これらからのアーティファクトのレンダリングがシーンの複雑さに対応できないほど小さくなり、通常はジオメトリの欠落またはちらつきとして現れます。 このようなアーティファクトが発生する場合は、NaniteStats を使って候補クラスタと可視クラスタの安全な値を判断します。 具体的には、ClustersSW と ClustersHW の統計情報を参照してください。 現在、候補クラスタのメモリ コストは 12 バイトで、可視クラスタは 16 バイトです。
このコンソール変数はランタイム時には変更できず、コンフィグ ファイル (.ini) で指定する必要があります。