1. サイトトップ
  2. ブログ
  3. Unity
  4. 【Unity】OnRenderImageと複数カメラ

【Unity】OnRenderImageと複数カメラ

はじめに

こんばんは、代表の堂前です!

前回の投稿でUnityのOnRenderImageについて書きました。
その時は突き詰められず情報不足となりましたが、もう少し突っ込んで調査を行いました。
今回は複数のカメラの際のOnRenderImageについてです。

前回のと併せ、更にOnRenderImageについて理解していきましょう。

※検証したのはMacのUnity5.4.1系になります。


複数カメラの時のOnRenderImage

OnRenderImageはイメージエフェクト処理のため、ある程度柔軟性高くGrab RenderTexture(絵のコピー)を行っていました。
前回では例えばアンチエイリアス(以下、AA)時はGrabを行い、そうでない時はGrabを行わないということです。

考えうる限りGrabを行わないようになっており処理として優れているのですが、今回はもう少し意地悪して、複数のカメラの際のGrabについて確認します。

unity_onrenderimage_camerasscene

「Camera 0」「Camera 1」の複数カメラを用意しました。
こちらの状況は以下のようになっています。

・AAはカットしている状態。
・Camera.depthを設定し、「Camera 0 → Camera 1」と描画するようにしている。
・両方共「Bloom Optimized」を付与。(OnRenderImageがある)
・Camera 0のClear Flagsは「Solid Color」としている。

この状況でFrame Debuggerで確認してみます。


複数カメラ時のGrab有無

結論から言いますと、「Camera 1」(後で描かれる方)のClear Flagsで状況が変わっていきます。
それぞれ見ていきます。

unity_onrenderimage_camerasgraboff unity_onrenderimage_camerasgrabon
「Don’t Clear」 or 「Depth only」 「Solid Color」 or 「Skybox」

Cameraが複数あるので、それぞれの担当箇所を黄色の枠線で括りました。
前半が「Camera 0」、後半が「Camera 1」となります。

その「Camera 1」でのClear Flagsでの違いになりますが、それによりGrabの有無が発生します。

それぞれの描き先のRenderTextureからなぜこうなるかを考えてみましょう。

  「Don’t Clear」 or 「Depth only」 「Solid Color」 or 「Skybox」
Camera 0 モデルなどはテンポラリに描画。
テンポラリを加工してブルームとし、デフォルトターゲットに描画。
Camera 1 デフォルトターゲットにモデルを描画。 新規テンポラリを用意し、必要に応じてクリア。
新規テンポラリにモデルやSkyboxを描画。
デフォルトターゲットをGrab!  新規テンポラリを加工してブルームとし、デフォルトターゲットに描画。
Grabしたテクスチャを加工してブルームとし、デフォルトターゲットに描画。

前回の記事より、Camera 0ではまず別のテンポラリにモデルを描きます。
そのテンポラリを加工し、デフォルトに戻すことを行っています。
これは単一のカメラで考えると理想の処理です。

が、Camera 1ではデフォルトターゲットに描かれているため、イメージエフェクトのためにGrabを行わなければなりません!
よって複数カメラ時は無駄な処理が出る可能性があります。

なぜCamera 1のClear FlagsでGrabの有無が発生するかについて説明します。
「Solid Color」や「Skybox」では画面を真っさらにする処理が入ります。
ですので、Camera 0 の描画結果は全く関係なくなります!
よってデフォルトターゲットに上書き、Grabなどは必要なく、更に新規RenderTextureを設けるようです。

 

この様に、トリッキーのシチュエーションではありますが、複数カメラ時のOnRenderImageは、やはり内部Grabを気に知る必要が生じてきます。
負荷などを完全に把握したい場合は、やはり「自前RenderTexture&OnPostRender」が理想ではと感じますが、状況に応じて取捨選択をすると良いでしょう。


 

 

【免責事項】
本サイトでの情報を利用することによる損害等に対し、株式会社ロジカルビートは一切の責任を負いません。