はじめに
こんばんは、代表の堂前です!
前回の投稿でUnityのOnRenderImageについて書きました。
その時は突き詰められず情報不足となりましたが、もう少し突っ込んで調査を行いました。
今回は複数のカメラの際のOnRenderImageについてです。
前回のと併せ、更にOnRenderImageについて理解していきましょう。
※検証したのはMacのUnity5.4.1系になります。
複数カメラの時のOnRenderImage
OnRenderImageはイメージエフェクト処理のため、ある程度柔軟性高くGrab RenderTexture(絵のコピー)を行っていました。
前回では例えばアンチエイリアス(以下、AA)時はGrabを行い、そうでない時はGrabを行わないということです。
考えうる限りGrabを行わないようになっており処理として優れているのですが、今回はもう少し意地悪して、複数のカメラの際のGrabについて確認します。
「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で状況が変わっていきます。
それぞれ見ていきます。
「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」が理想ではと感じますが、状況に応じて取捨選択をすると良いでしょう。
【免責事項】
本サイトでの情報を利用することによる損害等に対し、株式会社ロジカルビートは一切の責任を負いません。