🦔

UnityにおけるZバッファ、カリング、バッチング、インスタンシング

2025/02/10に公開

はじめに

Zバッファ、カリング、バッチング、インスタンシングの概要と利用方法

Unityは3Dおよび2Dシーンのレンダリングにおいて、複数の最適化技術を提供しています。
各技術の基本概念と、Unityでどのように利用できるかまとめました。


Zバッファ (Depth Buffer)

概要

Zバッファは、各ピクセルごとにカメラからの深度情報を保持するバッファです。これにより、レンダリング時に各ピクセルの深度値を比較し、カメラに最も近いピクセルのみを表示することで、正しい隠面処理が実現されます。

Unityでの利用方法

  • カメラ設定
    Unityでは、各カメラコンポーネントの「Near Clip Plane」と「Far Clip Plane」でZバッファの有効範囲を定義しています
  • シェーダー内の設定
    透明なオブジェクトでは「ZWrite Off」を指定することで、描画順序をカメラの透明度ソートに依存させます
  • Zファイティングへの対応
    クリッピング平面の調整や「Z-Spacing」の設定を調整することで、Zファイティングを防ぐことができます

カリング (Culling)

概要

カリングは、画面に映らないオブジェクトやポリゴンを描画対象から除外する技術です。主な種類には以下があります。

  • フラスタムカリング
    カメラの視錐台外にあるオブジェクトを除外
  • バックフェイスカリング
    ポリゴンの裏面を描画しない
  • オクルージョンカリング
    他のオブジェクトに隠れて見えないものを描画対象から除外

Unityでの利用方法

  • フラスタムカリング
    Unityはフレームごとに自動的にカメラの視錐台内のオブジェクトのみを描画します
  • バックフェイスカリング
    シェーダー設定の「Cull Back」を使用し、裏面を描画しないようにします
  • オクルージョンカリング
    Unityの「Occlusion Culling」機能を有効化することで、カメラに映らないオブジェクトの描画を防ぎます

バッチング (Batching)

概要

バッチングは、複数の描画コールをまとめて処理し、CPUとGPU間の通信回数を減らすことでレンダリング負荷を軽減する技術です。Unityでは以下の3種類のバッチングが利用できます。

  • 静的バッチング (Static Batching)
    動かないオブジェクトのメッシュを統合し、描画コール数を削減
  • 動的バッチング (Dynamic Batching)
    小さいメッシュを持つオブジェクトの描画コールをまとめる
  • SRPバッチャー (SRP Batcher)
    スクリプタブルレンダーパイプライン(SRP)で、同じシェーダーバリアントを使用するマテリアルの描画を最適化

Unityでの利用方法

1. 静的バッチング

  • 設定方法
    • GameObjectのInspectorで「Static」にチェックを入れると適用される
    • メッシュが統合されるため、メモリ使用量が増加する可能性がある

2. 動的バッチング

  • 適用条件
    • 900を超える頂点アトリビュートと300を超える頂点を含むメッシュでない場合

3. SRPバッチャー

  • 設定方法
    • URP(ユニバーサルレンダーパイプライン)での設定
      1. URPアセット を選択
      2. InspectorAdvanced セクション → SRP Batcher を有効化
    • HDRP(HDレンダーパイプライン)での設定
      1. HDRPアセット を選択
      2. Inspector をデバッグモードに切り替え、SRP Batcher のオプションを確認・有効化

インスタンシング (Instancing)

概要

インスタンシングは、同一のジオメトリとマテリアルを持つオブジェクトを、一括で描画する技術です。

Unityでの利用方法

  • GPUインスタンシングの有効化
    • マテリアルの「Enable GPU Instancing」をオンにすることで、Unityは同一メッシュを自動的にインスタンシングします
  • スクリプトAPIの活用
    • Graphics.DrawMeshInstanced などのAPIを使用することで、インスタンシングを手動制御できます

参考文献

参考

https://docs.unity3d.com/ja/2023.2/Manual/CamerasOverview.html
https://docs.unity3d.com/ja/2023.2/Manual/SL-ZWrite.html
https://docs.unity3d.com/ja/current/Manual/OcclusionCulling.html
https://docs.unity3d.com/ja/current/Manual/DrawCallBatching.html
https://docs.unity3d.com/ja/2023.2/Manual/SRPBatcher.html
https://docs.unity3d.com/ja/2023.2/Manual/GPUInstancing.html

Discussion