【Unreal Engine】Naniteでハイポリメッシュを扱う:LOD作りから解放される

作成: 2026-02-07最終更新: 2026-07-20

ポリゴン数を気にしてモデルを削る作業から解放するのがNanite。仕組みと有効化の3通り、Translucent非対応などの制限を図解し、ハイポリを並べて可視化モードで確かめる実践つき。

ゲーム用のモデルを作るとき、長年ついてまわった作業があります。 ポリゴンを削る ことと、 LODを何段階も用意する こと。ZBrushで作り込んだ数百万ポリゴンのモデルも、そのままでは持ち込めない。それが常識でした。

Nanite は、この前提を崩す仕組みです。 数十億ポリゴン規模でも、そのまま置ける 。手動のLOD作成も不要になります。この記事では、Naniteが何をしているのかと有効化の方法、 知らないとハマる制限 、そして 可視化モードで効き方を目で確かめる 手順を解説します。

数百万ポリゴンのモデルが、そのままゲームに置かれているイメージ

この記事でわかること

  • Naniteは 画面のピクセルに合わせて詳細度を決める 仕組み
  • 手動LODが不要 になり、切り替わりの段差も見えない
  • 有効化は 3通り (インポート時・一括・個別)
  • Translucentは非対応 ——これが最大の落とし穴
  • 実践:ハイポリを並べて 可視化モードで確かめる

Sponsored

Naniteは何をしているのか

従来のLODは、 あらかじめ何段階かの簡略メッシュを用意しておき、距離で切り替える 仕組みでした。だから作る手間がかかり、切り替わる瞬間に 形が変わって見える(ポップ) 問題もありました。

Naniteの発想は違います。

従来のLODが段階的に切り替わるのに対し、Naniteは画面のピクセルに合わせて連続的に詳細度を決める様子の対比図

Naniteは、1つの高精細メッシュを クラスタ(三角形の小さなまとまり) に分解して保持します。そして描画のたびに、 画面上で必要な細かさに合わせて、どのクラスタをどの精度で使うかを決めます

ポイントは 「画面のピクセルを基準にしている」 ことです。遠くの岩は画面上で数ピクセルにしかならないので、そのぶんだけの三角形しか使いません。近づけば必要な分だけ細かくなります。 段階ではなく連続的に変わる ので、切り替わりが見えません。

さらに、必要なデータだけをストレージから読み込む オンデマンドストリーミング で動いています。この性質上、 SSDが強く推奨 されます。HDDだと読み込みが追いつかず、ディテールが遅れて現れる(ポップイン)ことがあります。

結果として得られるもの:

  • ポリゴン数を気にせずモデルを持ち込める
  • 手動でLODを作る作業がなくなる
  • ノーマルマップで凹凸を「描く」代わりに、 実際の形状 で表現できる
  • 同じメッシュを大量に置いても、ドローコールが膨らみにくい

有効化する3つの方法

状況に応じて使い分けます。

インポート時・一括・個別という3つの有効化方法を並べた図
タイミング手順使う場面
インポート時インポートオプションの Build Nanite にチェック新しく取り込むとき
一括コンテンツブラウザで複数選択 → 右クリック → Nanite → Enable途中から導入するとき
個別Static Mesh Editor → Nanite SettingsEnable Nanite Support特定の1つだけ試すとき

新規プロジェクトなら、 インポート時にオンにしておく のがいちばん手間がかかりません。

Lightmap UVの生成は切れることがあります。 LumenとVirtual Shadow Mapsを使い、ライトマップを焼かない構成なら、インポート時に Generate Lightmap UVs をオフにできます。高精細メッシュではこの生成だけでかなりの時間がかかるので、効果は小さくありません。

どのメッシュに効くか

対応しているメッシュなら 基本的に全部オンで構いません 。悪影響はほとんどないので、迷ったら有効化しておくのが実務的です。

そのうえで、 恩恵の大きさには差があります

三角形が多い・大量に置く・遮蔽する大きな壁といった恩恵の大きいケースと、スカイスフィアのような小さいケースを対比した図
効果が大きい効果が小さい
三角形が多いメッシュ画面いっぱいに映るメッシュ
同じものを大量に置く(岩、瓦礫、建物)シーンに1つしかないメッシュ
他を遮蔽する 大きな壁・地形何も遮蔽しないもの
Virtual Shadow Mapsで影を落とすもの

分かりやすい例外が スカイスフィア です。画面いっぱいに映り、1つしか置かず、何も遮蔽しない——Naniteの得意分野から全部外れています。ただし、こうした例外はまれです。

知らないとハマる制限

Naniteは万能ではありません。 特に1つ目は必ず踏む ので、先に知っておいてください。

Translucent非対応、Maskedはコスト増、マテリアルの負荷は別問題という3つの制限を示した図
制限内容
Translucent(半透明)非対応 。ガラス、水面、エフェクトには使えません
Masked(マスク)対応するが コストが高め 。大量の草木で使うときは注意
World Position Offset複雑な変形はNaniteの最適化と相性が悪いことがあります
マテリアルの負荷Naniteが解決するのは ジオメトリだけ 。重いシェーダーは重いまま
ディスク容量元の 2〜3倍 に増えることがあります
マテリアルID1メッシュあたり 最大64

「Naniteにしたらメッシュが消えた」 。この場合、原因はほぼ確実にTranslucentマテリアルです。ガラスや水を含むモデルは、その部分だけNaniteを使わない構成にします。

そしてもう1つ、誤解されやすい点です。 Naniteはジオメトリの問題を解決する仕組みであって、マテリアルは別問題 です。数百万ポリゴンが軽く動いても、そこに重いシェーダーを乗せればフレームレートは落ちます。

Skeletal Meshへの対応 は、UE 5.4で実験的に導入され、 5.5で安定化 しました。ただしモーフターゲットやクロスシミュレーションには制限が残ります。

そして 草木(Foliage)については、後のバージョンで専用の仕組みが追加されました 。上の表にある「Maskedはコストが高め」という制限は、大量の葉をMaskedマテリアルで描くことが前提でした。新しい方式では葉の形そのものを別の持ち方で表現するため、森のような密度でもNaniteの恩恵を受けやすくなっています。 使えるかどうかはお使いのバージョン次第 なので、Project Settings → Rendering のNanite関連の項目を確認してください。

Sponsored

実践:ハイポリを並べて、効き方を見る

オープンワールドの岩場、廃墟の瓦礫、フォトグラメトリでスキャンした遺跡——「高精細なモデルを大量に置く」場面はどのジャンルでも出てきます。ここでは Naniteが実際に何をしているかを、目で確かめます

数字を眺めるだけでは腑に落ちません。 可視化モードで見る のがいちばん早い理解です。

再現用の準備: 三角形の多いStatic Meshを1つ用意します。フォトグラメトリ素材でも、Quixel Bridgeの岩でも構いません。

対象設定
ハイポリのStatic Mesh最初は Naniteオフ の状態から始めます
レベルそのメッシュを 50個ほど 並べて配置

ステップ1:オフの状態を測る。 メッシュを並べたら、まず現状を記録します。

ビューポートでコンソール(` キー)を開き、stat unit を実行します。Draw(描画に使っている時間)の数値を控えておいてください。

ステップ2:Naniteを有効にする。 コンテンツブラウザでそのメッシュを右クリック → NaniteEnable

処理が終わったら、もう一度 stat unit を見ます。 Draw の数値が下がっていれば 、効果が出ています。

ステップ3:可視化モードで中を覗く。 ここが本題です。ビューポート左上の View Mode(既定では Lit をクリックし、 Nanite Visualization から表示を切り替えます。

Triangles・Clusters・Overdrawの3つの可視化モードで、それぞれ何が見えるかを示した図
モード見えるもの見方
Triangles三角形の密度近くほど密、遠くほど疎 になっていれば正常
Clustersクラスタの分割色ごとのまとまりが、距離で大きさを変える
Overdraw重なって描かれている量紫が良好、オレンジが問題

Triangles にして、カメラを前後に動かしてみてください。 近づくと密度が上がり、離れると下がります。この変化が Naniteが毎フレームやっていること です。しかも Lit に戻すと、その変化はまったく見えません。

ステップ4:stat Nanite で数字も見る。 コンソールで stat Nanite を実行すると、実際に描画している三角形数やインスタンス数が表示されます。 元のメッシュの総ポリゴン数より、ずっと少ない数 が出ているはずです。

これが「数十億ポリゴンでも動く」理由です。 持っているデータの量と、実際に描く量は別物 です。

うまくいかないときの切り分けです。

  • メッシュが表示されない → マテリアルがTranslucentです。Opaqueに変えるか、Naniteをオフに
  • Nanite → Enable が出てこない → Static Meshではないか、対応していない形式です
  • 可視化モードで何も変わらない → そのメッシュがNanite化されていません。Static Mesh Editorで Enable Nanite Support を確認
  • Draw が下がらない → もともと三角形が少ないメッシュか、ボトルネックが別(マテリアルなど)にあります

ポイントは2つです。

  • 持っているデータ量と、描く量は別: Naniteは「全部描く」のではなく「必要な分だけ描く」仕組みです。stat Nanite の数字と元のポリゴン数を比べると、それが数字で確認できます
  • 効果を測るときは Draw を見る: stat unitGame はゲームスレッド、 Draw が描画側 です。Naniteが効くのはこちらなので、比較する数値を間違えないようにします

ジオメトリを軽くしても重い場合、犯人はマテリアルかもしれません(→ マテリアル入門)。表示距離そのものを絞りたいなら LODとCulling が別の切り口です。

Sponsored

おまけ:先に知っておくと良いこと

Naniteにしてもコリジョンは別データです。 描画が軽くなっても、当たり判定は従来どおりSimple/Complexの設定に従います。「Naniteにしたから当たり判定も最適化された」ということはないので、コリジョンは変わらず自分で設計します(→ SimpleとComplexの使い分け)。

ディスク容量の増加は見込んでおく。 Nanite化するとメッシュのデータ量が2〜3倍になることがあります。1つ2つなら気になりませんが、プロジェクト全体で有効化すると、リポジトリのサイズにはっきり効いてきます。

古いプロジェクトでは、まずレンダリング設定を確認。 UE4から移行したプロジェクトなどでは、Naniteの前提となる設定(Shader Model 6 など)が揃っていないことがあります。Project Settings → Rendering を確認してください。

C++から状態を確認できます。

UStaticMeshComponent* MeshComp = FindComponentByClass<UStaticMeshComponent>();
if (MeshComp && MeshComp->GetStaticMesh())
{
    const bool bNanite = MeshComp->GetStaticMesh()->IsNaniteEnabled();
    UE_LOG(LogTemp, Log, TEXT("Nanite enabled: %s"), bNanite ? TEXT("Yes") : TEXT("No"));
}

大量のアセットに対して「Naniteが漏れていないか」を調べたいときに使えます。


まとめ

Naniteを使うときに押さえる点は、この5つです。

観点結論
何が変わるか手動LODが不要 、ポリゴン数の制約から解放
有効化インポート時/一括/個別の3通り。 迷ったらオン
効くメッシュ三角形が多い・大量に置く・遮蔽が大きいもの
最大の落とし穴Translucentは非対応
誤解しやすい点解決するのは ジオメトリだけ 。マテリアルとコリジョンは別

そして理解の核心が1つ。 持っているポリゴン数と、実際に描くポリゴン数は違う ということです。ここが腑に落ちると、「数十億ポリゴン」という表現が誇張ではないことが分かります。

一度 Nanite VisualizationTriangles にして、カメラを動かしてみませんか?

さらに学ぶために