三角形を「画面の細かさ」まで自動で間引く / Virtualized geometry
Nanite の仕組み
Nanite は UE5 の仮想化ジオメトリです。ひとことで言うと「画面に映るのに必要なぶんだけ三角形を描く」仕組み。数千万ポリゴンのモデルを置いても、実際に処理されるのは画面ピクセルにほぼ見合った数の三角形だけ ── 遠ければ勝手に粗く、近ければ細かく。手作業のLODづくりから解放される、という話です。まず「なぜそれが要るのか」から。
Virtualized Geometry
Cluster
LOD
Visibility Buffer
まず用語だけ — 読む前の30秒
ポリゴン/三角形 polygon
3Dモデルを構成する面。GPUは基本すべて三角形として描く。
LOD level of detail
遠い物に粗いモデルを使う仕組み。従来は人手で複数版を用意した。
クラスタ cluster
Naniteがモデルを分けた三角形の小さな塊(約128枚単位)。処理の基本単位。
仮想化ジオメトリ virtualized geometry
必要なクラスタだけを都度ストリーミングして描く考え方。Naniteの核。
Visibility Buffer visibility buffer
各ピクセルに「どの三角形が見えるか」だけ先に記録する中間画像。
ソフトウェアラスタライズ software raster
極小三角形を、GPU固定機能でなく計算シェーダーで塗る独自経路。
※ 各語の詳しい定義は、ページ末尾の用語集にもあります。
§1 — The problem
従来の LOD の面倒くささ
遠くの物に高精細モデルを使うのは無駄です(1pxに三角形が何枚も入る ── Primer 02 のちらつきと同じ問題)。従来は、アーティストが同じモデルの粗い版を手で何段階も作り(LOD0/1/2…)、距離で切り替えていました。手間がかかるうえ、切り替わる瞬間にカクッと形が変わる(LODポップ)のも悩みでした。Nanite はこれを自動・連続にします。
従来 LOD
手作り・段階的
粗い版を人手で複数用意し距離で切替。作業量が多く、切替時に形が飛ぶLODポップが出る。
Nanite
自動・連続
元の高精細モデルを1つ入れるだけ。クラスタ単位で滑らかに粗密を切替え、ポップがほぼ無い。
§2 — Cluster LOD
距離を変えて、三角形の数を見る
下は同じモデルを、カメラ距離を変えて描いたものです。Nanite の狙いは「画面上の1三角形が、だいたい数ピクセルに収まる」ように粗密を選ぶこと。距離スライダーを動かすと、モデルは小さくなり、それに合わせて描く三角形数(=クラスタのレベル)が自動で下がります ── でも画面上の1三角形の大きさはほぼ一定のまま。ここが肝です。
「実際に描画」の数字は距離とともに大きく減るのに、「1三角形の画面サイズ」はほぼ一定 ── これが Nanite の効率の正体です。元が何百万三角形でも、遠ければ描くのはごく一部。しかも境界の色で分かるとおり、クラスタ単位でレベルが選ばれています。
§3 — How
中身 ── クラスタ・可視性バッファ・独自ラスタ
Nanite は3つの工夫で成り立っています。順に見ましょう。
1
クラスタ化と階層
モデルを約128三角形のクラスタに分け、それを段階的にまとめた木構造を事前構築。距離に応じて木のどの深さを使うか=粗密を選ぶ。
2
Visibility Buffer
各ピクセルに「どのクラスタ/三角形が見えているか」のIDだけを先に書く。見えるものだけあとでまとめてシェーディングでき、隠れた面のムダが消える。
3
ソフトウェアラスタ
数ピクセル以下の極小三角形はGPU固定機能が苦手。Naniteは計算シェーダーで自前で塗り、大きい三角形だけ従来経路に回す。
2番の Visibility Buffer は Primer 04 の G-Buffer と似ていますが、書くのは色ではなく「どの三角形か」のIDだけ。だから極小三角形が大量にあっても軽い。Nanite は「見える三角形の特定」と「色の計算」を分離した、と捉えると腑に落ちます。
§4 — Caveats
万能ではない ── 向き不向き
Nanite は「不透明で密な形」に最強ですが、苦手も明確です。世代を追って対応は広がっていますが、まず次の目安を覚えておくと判断が早いです。
得意
岩・建築・彫像など、不透明で高密度な静的メッシュ。大量配置でも強い。
苦手・注意
半透明、薄い葉が重なる植生(overdraw)、細かく動く物。世代で改善中だが要確認。
半透明が苦手なのは Primer 04 と同じ理由 ── 「1ピクセル=1つの見える三角形」に畳めないからです。植生は、葉の小片が何枚も重なって同じピクセルを塗り直すオーバードローが起きやすく、そこが重くなります。
§5 — In UE
UEでの実際 ── 有効化と可視化
スタティックメッシュのアセット設定で Enable Nanite Support を入れるだけで有効になります。効いているか・どう分割されているかは、ビューポートの可視化モードで目視できます。
Nanite Visualization
Triangles / Clusters
§2でやった三角形・クラスタの分割を実機で色分け表示。粗密が意図通りか確認できる。
Overdraw
重なりを見る
同じピクセルを何回塗ったかを可視化。植生や薄板で赤くなったら要最適化のサイン。
Lumen と併用
UE5 の両輪
Naniteが「形」を、Lumenが「光(GI・反射)」を担う。次に学ぶならライティング=Lumenが自然。
これで Primer 01〜06 を一周しました:スレッド → テクスチャ → マテリアル → 描画パス → ポスト → Nanite。次はいよいよ光(Lumen / 影)に踏み込むと、UE5 の絵づくりの全体像がつながります。