【Unreal Engine】LOD・カリング・オクルージョンで描く量を減らす

作成: 2025-12-12最終更新: 2026-07-20

Drawが重いときに効く「描かない」技術の全体像。LODで遠くを簡略化し、フラスタムカリングとオクルージョンカリングで見えない物を外し、Cull Distance Volumeで距離を切る。Freeze Renderingで効き目を目視する実践つき。

木を1本置いたときは軽かったのに、3,000本並べたら重くなった。stat unit で測ったら Draw がいちばん大きい。この状態は、CPUが毎フレーム3,000回分の描画指示を書いている状態です。

ここで効くのが 描く量そのものを減らす という発想です。遠くのものは粗く描き、画面の外や物陰にあるものはそもそも描かない。この記事では、LOD・フラスタムカリング・オクルージョンカリング・距離カリングの4つを整理し、それぞれが stat unit のどの数字に効くかまで解説します。

遠くの木が簡略な形になり、画面外と物陰の木がグレーで外されている様子

この記事でわかること

  • 4つの技術に共通する発想= 見えないもの・遠いものは手を抜く
  • LOD の設定と、切り替え距離の調整
  • フラスタムカリングオクルージョンカリング (どちらも自動)
  • Cull Distance Volume で距離を切る
  • Freeze RenderingCtrl + Shift + O)で カリングの効き目を目で見る
  • 実践:木を3,000本並べたシーンで Drawを減らす

Sponsored

共通する発想:全部を真面目に描かない

前の記事 stat unitで重さの原因を特定する で、Draw は「CPUが描画命令を組み立てる時間」だと確認しました。この数字は、 描画対象の数 にほぼ比例して増えます。

だから減らし方は2通りしかありません。 描く対象の数を減らす か、 1つあたりを軽くする かです。

4つの技術を、対象を減らす系(フラスタム・オクルージョン・距離)と1つを軽くする系(LOD)に分けた分類図
技術やること主に効く数字自動か
LOD遠いものを簡略なメッシュに差し替えるGPU(三角形が減る)設定が必要
フラスタムカリングカメラの視野外を除外するDraw自動
オクルージョンカリング物陰に隠れたものを除外するDraw自動(PC/コンソール)
距離カリング一定距離より遠いものを除外するDraw設定が必要

自分で手を入れる余地があるのは、実質 LODと距離カリングの2つ です。残り2つはエンジンが勝手にやってくれているので、「効いているかどうかを確認する」のが仕事になります。


LOD:遠くのものを粗く描く

LOD(Level of Detail)は、 カメラからの距離に応じて、簡略なメッシュに差し替える 仕組みです。遠くの木が10,000三角形である必要はありません。画面上で20ピクセルにしかならないなら、500三角形でも見た目は変わりません。

同じ木がLOD0からLOD3へ、距離に応じて段階的に簡略化されていく図。画面上の見た目はほぼ変わらない

生成する

Static Mesh Editorを開き、右側の詳細パネルにある LOD Settings を使います。

  1. Number of LODs に段数を入力します(背景アセットなら3〜4段が目安)
  2. Apply Changes を押すと、エンジンが元メッシュから簡略版を自動生成します

もっと手軽なのは LOD Group です。SmallPropLargeProp といったプリセットを選ぶだけで、そのカテゴリに合った段数と距離が一括で設定されます。個別に詰める前に、まずここから試すのが早道です。

切り替え距離を調整する

各LODには Screen Size という値があります。これは距離そのものではなく、 そのメッシュが画面上で占める大きさの割合 です。Screen Size が 0.25 なら、画面の縦横のおよそ4分の1を占める大きさまで縮んだところで、次のLODへ切り替わります。

距離ではなく画面占有率を基準にしているのは、画角や解像度が変わっても破綻しないためです。

アセットの性格方針
プレイヤーが近くでじっと見るもの(武器、主要キャラの装備)LOD0を長く維持する(次の Screen Size を小さめに)
大量に置く背景(岩、木、瓦礫)早めに切り替える(Screen Size を大きめに)

確認する

いま何段目のLODが表示されているかは、目で見て確認できます。ビューポート左上の View Mode(既定は Lit)から Level of Detail ColorationMesh LOD Coloration を選ぶと、LOD段数ごとに色分けされます。カメラを前後に動かして、色が切り替わる距離が意図どおりか確かめてください。

Sponsored

カリング:そもそも描かない

LODが「粗く描く」なら、カリングは 「1ミリ秒も使わない」 方です。効果としてはこちらの方が大きく、そして大半が自動で動いています。

カメラの視錐台の外にある木と、壁の裏に隠れた木が、どちらも描画対象から外れている俯瞰図

フラスタムカリング

カメラの視野(視錐台=フラスタム)の外にあるものを描かない 処理です。UEが常時、自動で行っています。

開発者が設定することはほとんどありませんが、1つだけ知っておくと役立つ事実があります。判定は メッシュそのものではなく、そのアクターのバウンズ(境界ボックス) で行われます。バウンズが不自然に大きいアクターは、画面外に出てもカリングされません。マテリアルで World Position Offset を使ったときなどに、バウンズを手動で広げるとこれが起きます。

オクルージョンカリング

手前の物に完全に隠されているものを描かない 処理です。壁の裏、建物の中、地形の向こう側。ここにあるオブジェクトの描画コストがゼロになります。

PCとコンソール向けのUE5では、GPUを使った ハードウェアオクルージョン(Hierarchical Z-Buffer) が既定で有効です。特別な設定は要りません。Project Settings → Engine → Rendering → CullingOcclusion Culling にチェックが入っていることだけ確認しておけば十分です。

ただし、性質上のクセが2つあります。

  • 1フレーム遅れる: 前のフレームの深度情報をもとに判定するため、カメラを高速で振ると一瞬だけ描かれてしまうことがあります
  • 判定にもコストがある: オブジェクトが数万個ある状態では、オクルージョン判定そのものが Draw に乗ってきます。この段階に来たら、距離カリングやインスタンス化を併用します

モバイル向けには、CPUで計算する ソフトウェアオクルージョン が別に用意されています。こちらを使う場合は、遮蔽物になるメッシュに LOD for Occluder Mesh を設定して、判定用の簡略メッシュを指定します。

遮蔽する物を大きく作る ことは、意識する価値があります。細かい柱をたくさん並べるより、1枚の大きな壁の方が、後ろにあるものをまとめて隠せます。レベルデザインの段階で「視線を遮る大きな面」を配置しておくと、それだけで描画対象が大きく減ります。


Cull Distance Volume:距離で切る

自動のカリングでは足りないとき、 「この距離より遠いものは描かない」 と明示的に決められます。方法は2つです。

個別に設定する場合 は、アクターを選んで詳細パネルの Rendering セクションにある Desired Max Draw Distance に距離(Unreal Unit、1uu = 1cm)を入れます。10,000 と入れれば100メートル先で消えます。

まとめて設定する場合 は、Place Actors パネルから Cull Distance Volume をレベルに配置します。このボリュームが囲む範囲のアクターに対して、 サイズに応じたカリング距離 を一括で適用できます。

Cull Distance Volumeのサイズ対応表と、小さい物が手前で消え、大きい物は遠くまで残る様子の図

ボリュームの詳細パネルにある Cull Distances は、SizeCull Distance のペアの配列です。

Size(オブジェクトの大きさ)Cull Distance(この距離で消える)
1003,000
50010,000
200030,000

エンジンは各アクターのバウンズの大きさを見て、この表から近い行を選びます。 小さい物ほど手前で消え、大きい物は遠くまで残る という設定が、1つのボリュームで実現できます。地面に落ちている小石が100メートル先で消えても誰も気づきませんが、山が消えたら分かります。この直感をそのまま表にしたのがCull Distance Volumeです。

距離を詰めすぎると、 歩いているだけで前方に物が湧いて出る(ポップイン) ことになります。実際に歩き回って、気になったら距離を伸ばす。この往復で決めるのが現実的です。

Sponsored

Freeze Rendering:カリングを目で見る

カリングの困った点は、 効いているかどうかが画面から分からない ことです。ちゃんと除外されていても、見えていないのだから見た目は同じです。

これを覗く仕掛けが Freeze Rendering です。プレイ中に Ctrl + Shift + O を押すと、 その瞬間の描画対象リストが凍結 されます。コンソールで FreezeRendering と打っても同じです。

Freeze Rendering実行後にカメラを後退させると、視界に入っていなかった範囲が空白のまま残る様子

凍結したままカメラを後ろへ引くと、 凍結時に描画対象だったものだけが残り、それ以外は空白 になります。壁の裏にあったオブジェクトが、まるごと消えているのが見えるはずです。これがオクルージョンカリングの実際の効き目です。

もう一度 Ctrl + Shift + O を押すと解除されます。

数字で確認したいときは stat initviews です。1フレームで何個のプリミティブが処理され、そのうち何個がフラスタムとオクルージョンで除外されたかが出ます。 Frustum Culled PrimitivesOccluded primitives の数を見て、除外されている割合が低ければ、遮蔽物の配置か距離カリングを見直す段階です。


Naniteとの関係

UE5では Nanite が、この話の一部を肩代わりします。ただし「全部を置き換える」わけではありません。ここを取り違えると設定が抜けます。

項目Naniteが面倒を見るか
Static MeshのLOD見る(手動のLOD作成が不要になる)
Skeletal MeshのLOD5.5以降で対応が進んだが、 従来のLODが現役
半透明マテリアルのメッシュ見ない(Nanite非対応。LODが必要)
フラスタムカリング見る(Nanite内部でクラスタ単位のカリングを行う)
オクルージョンカリング見る(同上)
Cull Distance Volume / 描画距離見ない 。表示距離は自分で決める

つまり Nanite化しても、距離カリングの判断は自分の仕事のまま です。そしてキャラクターや草木(半透明・マスク)には従来のLODが必要です。Naniteの仕組みと制限は Naniteでハイポリメッシュを扱う で詳しく扱っています。


実践:木を3,000本並べてDrawを減らす

オープンワールドの森、RTSの広いマップ、サバイバルゲームの拠点。 同じアセットを大量に並べる 場面はどのジャンルにもあります。ここでは重い森を作り、Drawを実際に下げるまでを通します。

Drawが14.6msから5.1msへ下がる棒グラフと、その横に並ぶ「LOD追加」「Cull Distance Volume配置」の2つの手当て

再現条件を作る

項目設定
レベルFile → New Level → Basic
配置するメッシュ三角形 8,000程度 のStatic Mesh 1種(LODなし・Naniteオフの状態から始める)
個数3,000個
配置範囲半径 20,000uu(200メートル)の円内にランダム配置

配置はレベルブループリントの BeginPlay から Spawn Actor from Class を3,000回ループするのが早いです。Naniteは意図的にオフのままにしてください(オンにすると、この記事の効果が見えなくなります)。

ステップ1:現状を測る

Standalone Game で起動し、森が視界に入る位置で stat unit を実行します。

Frame:  15.10 ms
Game:    2.30 ms
Draw:   14.62 ms
GPU:     9.80 ms

Draw の 14.62ms が最大です。CPUが3,000回分の描画命令を書いている状態で、まさに 描く対象が多すぎる 症状です。

続けて stat scenerendering を実行し、Mesh draw calls の数を控えておきます。3,000前後になっているはずです。

ステップ2:LODを追加する

Static Mesh Editorでそのメッシュを開き、LOD SettingsNumber of LODs4 にして Apply Changes を押します。

Standalone Game で測り直します。

Frame:  11.20 ms
Game:    2.28 ms
Draw:   14.10 ms
GPU:     4.90 ms

GPU が 9.80ms から 4.90ms へ半減 しました。遠くの木が簡略メッシュに置き換わり、塗る三角形が減ったからです。

一方で Draw はほとんど変わっていません (14.62 → 14.10ms)。LODは三角形を減らしますが、 描画命令の数は減らさない からです。木は依然として3,000本、全部が描画対象のままです。ここがLODの限界で、次の手当てが要る理由です。

ステップ3:Cull Distance Volumeを置く

Place Actors パネル(Window → Place Actors)で「Cull」と検索し、 Cull Distance Volume をレベルにドラッグします。

ボリュームを森全体が入る大きさに拡大し(Brush SettingsX / Y / Z をそれぞれ 45,000 程度)、詳細パネルの Cull Distances に次の1行を設定します。

SizeCull Distance
50012000

木のバウンズがおよそ500uuなので、 120メートル先で描画対象から外れる 設定です。

もう一度 Standalone Game で測ります。

Frame:   6.40 ms
Game:    2.25 ms
Draw:    5.14 ms
GPU:     3.60 ms

Draw が 14.62ms から 5.14ms へ落ちました。stat scenerenderingMesh draw calls も、3,000前後から1,000前後へ減っているはずです。Frameは15.10msから6.40msになり、60FPSどころか150FPS相当まで戻りました。

ステップ4:効き目を目で確かめる

森の中央でプレイ中に Ctrl + Shift + O を押し、そのままカメラを真上へ引いてください。 120メートルより外の木が、まるごと存在しない 状態が見えます。これがいま Draw を9ミリ秒ぶん節約している中身です。

その後、実際にプレイヤーを歩かせてみてください。前方に木が湧いて見えるなら、Cull Distance を 15000、18000 と伸ばして、気にならない距離を探します。

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

  • Draw が下がらない → Cull Distance Volume が木を囲めていません。ボリュームのサイズを確認してください。カリング対象になるのは ボリュームの内側にあるアクター です
  • 木が全部消えたCull Distance が小さすぎるか、Size の行が木のバウンズと合っていません。まず Size を 0 にした行(=すべてに適用)で試すと切り分けやすいです
  • GPU が下がらない → LODが生成されていません。Mesh LOD Coloration で色が変わるか確認してください
  • Freeze Renderingが効かない → エディタのビューポートではなくPIEかStandaloneで実行しているか確認してください

ポイントは2つです。

  • LODはGPU、カリングはDrawに効く: この対応を覚えておくと、stat unit の結果から打つ手が決まります。GPUが高いならLODとマテリアル、Drawが高いならカリングとインスタンス化。上の実践では、片方だけでは9ミリ秒は落ちませんでした
  • カリング距離は歩いて決める: 数字上はいくら短くしても得ですが、ポップインは没入感を壊します。数値で詰めたあと、必ず実際に歩いて確認してください

Draw をさらに詰めるなら、同じメッシュを1回の命令でまとめて描く Instanced Static MeshHierarchical Instanced Static Mesh が次の手です。そして「そもそもレベルに読み込まない」という別方向の解決は レベルストリーミングとWorld Partition で扱います。

Sponsored

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

同じメッシュを大量に置くなら、まとめて描ける。 木や岩のように 同じメッシュを何百・何千と置く 場合は、描画命令を1回にまとめる手があります(→ Instanced Static Meshで描画コールを減らす)。カリングと併用できます。

マテリアルスロットの数だけ描画命令が増えます。 1つのメッシュに5つのマテリアルスロットがあれば、それは5回の描画命令です。背景アセットをモデリングする段階でスロットをまとめておくと、Draw に効きます。3,000本の木のスロットを2つから1つに減らせば、それだけで描画命令が3,000回減ります。

影も描画対象です。 動的ライトが影を落とすオブジェクトは、影を描くためにもう一度描かれます。遠くのオブジェクトの Cast Shadow を切る、あるいはライトの Dynamic Shadow Distance を絞ると、見た目をほとんど変えずに負荷が下がります。

LODは自動生成でも十分なことが多いです。 背景アセットについては、エンジンの Apply Changes で作られたLODで実用に耐えます。手作業でLODメッシュを用意する価値があるのは、シルエットが崩れると目立つもの(建物のような直線的な形)に限られます。

Hierarchical Level of Detail(HLOD)という上の段があります。 遠くにある複数のアクターを、1つのまとまったメッシュに置き換える仕組みです。World Partitionを使うレベルでは、これが標準の道具立てに含まれます(→ レベルストリーミングとWorld Partition)。

r.VisualizeOccludedPrimitives 1 を実行すると、オクルージョンで除外されたオブジェクトの位置がワイヤーフレームで表示されます。Freeze Renderingより手軽に「いま何が隠れているか」を確認できます。


まとめ

技術何をする効く数字やること
LOD遠くを簡略メッシュに差し替えるGPUNumber of LODs を設定、または LOD Group を選ぶ
フラスタムカリング視野外を描かないDraw自動。バウンズが異常に大きくないか確認する
オクルージョンカリング物陰を描かないDraw自動。大きな遮蔽物をレベルに置く
距離カリング遠いものを描かないDrawCull Distance VolumeDesired Max Draw Distance

覚えておきたいのは対応関係です。 LODはGPU、カリングはDraw。 stat unit でどちらが大きいかを見てから、どちらの手当てを打つか決めます。

そして確認の道具が Ctrl + Shift + O(Freeze Rendering)と stat initviews です。カリングは効いていても見た目に出ないので、 効いていることを別途確かめる 必要があります。

ここまでは「レベルに置いてあるものを、いかに描かないか」の話でした。次は視点が1段上がって、 そもそもレベルに読み込まない という方法へ進みます(→ レベルストリーミングとWorld Partition)。

あなたのレベルで一度 Ctrl + Shift + O を押して、カメラを真上へ引いてみてください。思っていたより多くのものが、すでに除外されているかもしれません。

さらに学ぶために