OnRenderObject()の解説資料

概要

OnRenderObject() は Unity の MonoBehaviour に用意されている特殊なイベントメソッドで、オブジェクトの描画タイミングで呼び出される関数です。主にカスタム描画処理(GL, Graphics API)を記述する際に使用されます。


呼び出しタイミングと特徴

項目内容
呼び出しタイミングカメラがそのオブジェクトを描画しようとしたとき
実行タイミングUpdate() の後、OnWillRenderObject() の後、Camera.Render() の直後
複数カメラの場合カメラごとに呼ばれる(一度でなく複数回)
使用目的GL.Begin() や Graphics.DrawMeshNow() を用いたカスタム描画
スクリプトの条件オブジェクトが アクティブかつカメラに映っている必要あり

主な用途

  • ワイヤーフレームやデバッグ用のライン描画
  • GL クラスを使った低レベル描画
  • CommandBuffer を使わない軽量カスタム描画処理
  • 複数カメラに対して別の描画処理をしたいとき

使用例:GLを使ってラインを描画

using UnityEngine;

public class RenderLine : MonoBehaviour
{
    public Material lineMaterial;

    void OnRenderObject()
    {
        if (lineMaterial == null) return;

        lineMaterial.SetPass(0);

        GL.Begin(GL.LINES);
        GL.Color(Color.red);
        GL.Vertex3(-1.0f, 0.0f, 0.0f);
        GL.Vertex3(1.0f, 0.0f, 0.0f);
        GL.End();
    }
}

補足:

  • lineMaterial.SetPass(0) は描画シェーダーのパス指定です。
  • GL.Begin() ~ GL.End() の中で描画内容を定義します。
  • 実行対象となるオブジェクトにこのスクリプトをアタッチし、lineMaterial に適切なシェーダー(Unlitなど)を割り当てる必要があります。

他の描画系イベントとの比較

メソッド呼び出しタイミング用途
OnWillRenderObject()カメラが描画前に呼び出すカメラごとの制御(処理フラグなど)
OnRenderObject()描画時カスタム描画
OnPostRender()カメラが描画を終えた後エフェクトの後処理
OnRenderImage()画像効果を適用するときポストエフェクト用途(RenderTextureが必要)

注意点

  • メッシュ描画とは異なり、GL 描画はバッチ処理の対象外になるため、描画コストが高くなる可能性があります。
  • 描画結果が意図しないカメラにも適用されることがあるため、カメラのフィルタリングに注意が必要です(例:Camera.current の利用)。
  • URP/HDRPでは正しく動作しないこともあり、ScriptableRenderPassの利用が推奨されるケースもあります。

まとめ

  • OnRenderObject() は低レベル描画が必要なときに使う強力なフックポイント。
  • 一般的なゲームオブジェクトの表示とは異なり、シェーダー、マテリアル、描画順序への理解が不可欠。
  • プロファイルやフレームレートに注意しながら使用することが重要です。

この資料に含めたいサンプルやGL描画例をさらに追加したい場合はお知らせください。より実践的な応用資料も作成可能です。

概要

Unity では、レンダリング処理の各段階に対応するコールバックメソッドが提供されています。OnRenderObject() は「描画処理中(描画指示を出す段階)」で呼ばれますが、それ以前・以後にもイベントがあります。


各イベントの呼ばれる順序(描画処理の流れ)

    ┌────────────────────┐
    │ Update()           │ ← ロジック処理
    └────────────────────┘
              ↓
    ┌────────────────────┐
    │ OnWillRenderObject()│ ← カメラごとの事前処理
    └────────────────────┘
              ↓
    ┌────────────────────┐
    │ OnRenderObject()    │ ← GL描画などユーザー描画の指示
    └────────────────────┘
              ↓
    ┌────────────────────┐
    │ OnRenderImage()     │ ← ポストエフェクト(RenderTexture 必須)
    └────────────────────┘
              ↓
    ┌────────────────────┐
    │ OnPostRender()      │ ← カメラ描画完了直後
    └────────────────────┘

各イベントの違いと役割

イベント名呼び出しタイミング主な用途備考
OnWillRenderObject()描画前カメラが描画対象と判断した直後カメラごとに呼ばれる
OnRenderObject()描画中GL描画処理などを記述SetPass() 必須
OnPostRender()描画後(フレーム終了直前)デバッグ描画・UI重ね描きカメラ1台につき1回
OnRenderImage()描画直後(画像エフェクト前)ブラーやエッジ検出などのポストプロセスRenderTexture が必要

OnRenderObject()

 はなぜ「描画時」なのか?

  • OnRenderObject() は「Unityが描画命令(Draw Call)を発行する直前」で呼ばれる。
  • GL描画などの「ユーザーによるカスタム描画命令」をこのタイミングで渡すため、「描画前に準備」とも、「描画中に命令を出す」とも言える。
  • 実際のフレームバッファへのピクセル出力はこのあと。

使用目的に応じた選択ガイド

目的適したイベント
カメラごとの描画前処理OnWillRenderObject()
カスタム描画を行いたいOnRenderObject()
描画後にログやUIを追加したいOnPostRender()
ポストエフェクトを適用したいOnRenderImage()

まとめ

  • 描画前: OnWillRenderObject() は描画準備(フラグ設定など)に便利。
  • 描画時: OnRenderObject() は描画命令をGLなどで発行する場。
  • 描画後: OnPostRender() は描画が完了した後の処理を行う場。
  • それぞれの違いを意識して使い分けると、効率的かつ安全にカスタム描画が可能になります。

Unity

Posted by hidepon