【Unity】LOD・Occlusion Cullingで3D描画を軽くする:見えないものは、描かない

作成: 2026-07-16

3Dステージが広がるほどフレームレートが落ちていく——原因の多くは「遠くの高精細モデル」と「壁の裏の見えないオブジェクト」を律儀に描き続けていることです。距離に応じてモデルを差し替えるLOD Group、遮蔽物の裏を描画から外すOcclusion Culling、Far Clipとフォグによる距離設計まで、「見えないものは描かない」ための3つの道具を、街ステージの軽量化を題材に解説します。

小さなテスト部屋では60fpsで動いていたのに、ステージを街に広げた途端、フレームレートが坂道を転がり始めた——3Dゲームの成長期に必ず来る峠です。犯人はたいてい、あなたのカメラの生真面目さです。 500m先の豆粒みたいな建物を、フル精細のまま描いている目の前の壁の裏に隠れた街並みを、律儀に全部描いている

この記事は「 見えないもの・見えていないも同然のものは、描かない 」ための3点セット——距離でモデルを差し替える LOD、遮蔽物の裏を描画から外す Occlusion Culling、そして 距離設計(Far Clipとフォグ)——を、街ステージの軽量化を題材にまとめます。

遠くの建物が簡略化され、壁の裏が描画から外れるイメージ

この記事でわかること

  • 描画が重くなる2大原因( 遠くの高精細・壁の裏
  • LOD Group で距離に応じてモデルを差し替える
  • Occlusion Culling のベイクと、効くシーン・効かないシーン
  • Far Clipとフォグ による距離設計、レイヤー別の描画距離
  • 実践:街ステージをStatsの数値で軽くする

動作確認環境: Unity 2022.3 LTS / Unity 6

Sponsored

重さの2大原因:遠くも裏も、全部描いている

まず、Unityが標準で「やってくれること」と「やってくれないこと」の線を引きます。

  • やってくれる: カメラの視野(視錐台)の外にあるものは描かない——Frustum Culling は自動です
  • やってくれない(その1): 視野内なら、 500m先の建物も1m先と同じ精細さ で描きます。画面上では数ピクセルなのに、数万ポリゴンを処理する無駄
  • やってくれない(その2): 視野内なら、 壁の裏に完全に隠れたもの も描きます。GPUは描いた後に「隠れてた」と気づいて捨てています(オーバードロー)

つまり伸びしろは「距離」と「遮蔽」の2方向にあります。それぞれ専用の道具——LODとOcclusion Culling——を当てていきます。

LOD:距離に応じてモデルを差し替える

LOD(Level of Detail) は「距離に応じた精細度の段階」です。近くではフル精細のLOD0、離れたら中精細のLOD1、さらに離れたら低精細のLOD2、最後は Culled(描画しない) ——カメラからの見かけの大きさで、Unityが自動で切り替えます。

LODの段階図。同じ建物がカメラからの距離に応じてLOD0(高精細)、LOD1(中精細)、LOD2(低精細)、Culled(非表示)へ切り替わる

設定手順はシンプルです。

  1. 親GameObjectに LOD Groupコンポーネント を追加する
  2. 精細度違いの子メッシュ(例: Building_LOD0Building_LOD1Building_LOD2)を、LOD Groupの各スロットに割り当てる
  3. Inspectorのスライダーで 切り替わる画面占有率 を調整する(LOD Groupのバーをドラッグ。カメラアイコンを動かすとプレビューできます)

tips: 切り替えの瞬間が「パキッ」と目立つ場合は、切り替え比率を「プレイヤーが注視しない距離」まで遠ざけるのが第一手です。それでも気になる大型オブジェクトには、LOD GroupのFade Mode(Cross Fade)でブレンドできます。なお段階モデルの用意が難しければ、 LOD0とCulledの2段だけ でも「遠くを描かない」効果は得られます。

Occlusion Culling:遮られたものを描かない

もう1つの無駄が、壁の裏です。 Occlusion Culling は「どの場所から何が見えるか」を 事前計算(ベイク) しておき、実行時に遮られたオブジェクトを描画から外す仕組みです。

Occlusion Cullingの図。カメラの前に大きな壁があり、視野内でも壁の裏に隠れた建物たちは描画から除外され、見えている建物だけが描かれる

手順は3ステップです。

  1. 動かないオブジェクトにStaticフラグを立てる: 建物・壁・地形などを選び、Inspector右上のStaticチェックを入れる(少なくとも Occluder Static(遮る側)と Occludee Static(遮られる側)が対象になります。動く敵やアイテムはベイク対象外です)
  2. Window > Rendering > Occlusion Culling を開き、Bakeタブで Bake を実行する
  3. Occlusionウィンドウを開いたままSceneビューで確認する: カメラを壁の裏へ回すと、遮蔽されたオブジェクトが描画から消える様子が見えます

効く場所と効かない場所がはっきりした道具です。 屋内・街・洞窟のように「大きな遮蔽物が多い」シーンでは劇的に効きます。逆に見晴らしのいい平原では遮るものがないため効果はほぼゼロで、ベイクデータの容量と判定コストだけが残ります。シーンの性格で採否を決めてください。

Sponsored

距離設計:Far Clipとフォグ

3つ目の道具は、そもそも「 どこまで描くか 」という設計です。

  • CameraのFar Clip Planeを縮める: デフォルトの1000は、多くのゲームで過剰です。「ゲームプレイ上意味のある距離」まで縮めれば、それより先は視錐台の外=標準のカリングで消えます
  • フォグで境界を隠す: Far Clipを縮めると、遠くの物が「スパッと消える」断面が見えます。Lighting設定の Fog を有効にして、消える距離の手前から霧に沈めれば、切れ目は自然な空気遠近に変わります。演出と最適化が同時に手に入る、古典にして最強の組み合わせです
距離設計の図。カメラのFar Clipまでの描画範囲が短く設定され、その境界の手前からフォグがかかって、遠くの消失が自然な霧に見える

さらに一歩踏み込むと、 レイヤーごとに描画距離を変える ことができます。「大きな建物は遠くまで描くが、小物(ゴミ箱・看板・草)は近くだけ」という、オープンワールドの定番設計です。

// CameraDistanceCulling.cs — カメラに付ける
using UnityEngine;

public class CameraDistanceCulling : MonoBehaviour
{
    void Start()
    {
        Camera cam = GetComponent<Camera>();

        // レイヤーごとの描画距離(0はカメラのFar Clipを使う)
        float[] distances = new float[32];
        distances[LayerMask.NameToLayer("SmallProps")] = 40f; // 小物は40mまで
        cam.layerCullDistances = distances;
    }
}

小物用のレイヤー(例: SmallProps)を作って配置物に割り当てるだけで、「遠くの小物」がごっそり描画から消えます。LODを個別に設定して回るより先に、この一括の距離指定で大づかみに削るのが効率的です。

実践:街ステージを数値で軽くする

道具が揃ったので、重くなった街ステージを実際に軽くします。大事なのは 体感でなく数値で確認する ことです。GameビューのStatsボタンを開き、 Batches(描画命令の回数)と Tris(三角形数)を、同じカメラ位置で前後比較します。

街ステージの軽量化のビフォーアフター場面図。同じ街並みのカメラで、対策前は遠景も壁の裏もすべて描かれ数値が高いが、対策後は遠景が簡略化され壁の裏が消えて数値が下がっている
  1. 現状を記録する: プレイヤーがよく立つ場所にカメラを置き、Statsのスクリーンショットを撮る(例: Batches 2,400 / Tris 8.2M)
  2. 小物レイヤーの距離カリング: ゴミ箱・室外機・看板類を SmallProps レイヤーへ移し、40mで切る。Trisがまず一段落ちます
  3. 主役級の建物にLOD: 画面占有の大きい建物からLOD Groupを設定する。全部にやろうとしないこと——Statsを見ながら「効く順」に、上位の数棟からで十分です
  4. Occlusion CullingをBake: 街は遮蔽物だらけなので相性は抜群。路地に入った瞬間、視界を塞ぐ建物の裏がまとめて消えて、Batchesが大きく下がります
  5. Far Clip+フォグで仕上げ: 遠景の限界を決め、フォグで断面を隠す。最後にもう一度同じ場所でStatsを撮り、前後の数値を並べます(例: Batches 2,400→900 / Tris 8.2M→2.1M)

数字が下がったのに見た目がほぼ変わっていなければ、それが「見えないものを描いていた」ぶんです。もしLODの切り替えがパキパキ目立つなら比率を遠くへ、路地で物が「消え忘れる」ならStaticフラグの付け忘れを疑ってください——Occlusionのベイクは、Staticでないものを最初から相手にしません。

ポイントは2つ。 対策は必ず同じ場面のStatsで前後比較(体感は当てになりません)。 効く順に手を付ける(一括の距離カリング → 主役級のLOD → 遮蔽の多いシーンならOcclusion)。

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

  • 最遠段はBillboard/Impostorという手も: LODの最終段を「板ポリに焼いた絵」にする手法です。木や群衆など数が多いものに劇的に効きます。Unity標準ではTerrainの木がこの仕組みを使っており、汎用にはImpostor系アセットが定番です
  • 描画回数そのものを減らす話は別記事で: 同じマテリアルの物をまとめて描くバッチングやGPUインスタンシングは Draw Call最適化の記事 の領域です。LOD・Occlusionで「描く物の量」を減らし、バッチングで「描き方」を効率化する——2つは併用できます
  • モバイルではベイクデータも資産のうち: Occlusionのベイクデータはビルドに含まれます。モバイル最適化 の文脈では、効果とデータ容量を天秤にかけてください

まとめ

  • 標準のFrustum Cullingが消すのは 視野の外だけ。「遠くの高精細」と「壁の裏」は自分で対策する
  • LOD Group で距離に応じてモデルを差し替える。段階モデルが無ければ Culledだけでも効く
  • Occlusion Culling はStatic+Bakeで「遮られたもの」を消す。 遮蔽物の多いシーン専用 の道具
  • Far Clipを縮めてフォグで隠す のが距離設計の基本。小物は layerCullDistances で一括カット
  • 効果は必ず 同じ場面のStatsで前後比較。Batches と Tris が証拠になる

あなたの街ステージでいま Stats を開いたら、Batches はいくつでしょう——その数字を半分にする道具は、もう全部そろっています。