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() は描画が完了した後の処理を行う場。
- それぞれの違いを意識して使い分けると、効率的かつ安全にカスタム描画が可能になります。
ディスカッション
コメント一覧
まだ、コメントがありません