[Unity] 複数カメラのレンダリング結果をRenderTextureにまとめて表示する

UnityのレイヤーとRenderTextureを使用して複数のカメラからみた絵を
1つにコンポジットして出力するやり方を調べてみました。

まず、それぞれコンポジットする前の絵は別のカメラ・別のオブジェクトにしたかったので
Layerを使用して複数のオブジェクトを1シーンで配置します。
Unityのレイヤーは衝突のグルーピングなどにも使用しますが、今回のようにオブジェクト表示とカメラをグルーピングすることもできます。

まず、実際のシーンを作る前にUnityのレイヤーを設定します。

右上のLayersからEdit Layers…を選択して、レイヤー設定を開きます。

User Layerに新しいレイヤーを追加します。

新しいカメラを作成して、CullingMaskにそのカメラからレンダリングしたいレイヤーを指定。

レイヤーに入れるオブジェクトを、インスペクタのLayerで指定します。

 

わかりやすいようにキューブを中央に配置しました。

レイヤーに入れているオブジェクトは、
右上の Layersタブでレイヤ内のオブジェクトの表示・非表示を切り替えることが出来ます。

 

同様に別レイヤー(今回の場合でいうLayerB)にも同じ設定でテストオブジェクトを配置。

次に、Project→Create→RenderTextureをクリックして、レンダーテクスチャを作成します。
このレンダーテクスチャを使用すると、リアルタイムのカメラのレンダリング結果を
テクスチャとして扱えるようになります。

このレンダーテクスチャを、重ねたいレンダリングカメラのTargetTextureに指定します。

レンダーテクスチャの表示確認用にCanvasをつくってそれにRawImageでレンダーテクスチャを貼り付けした結果。

重ねたつもりが、後ろのSkyが背景色になってしまっていて上手く重ならないので
かさね方とソートを指定します。

カメラのClearFlagsがデフォルトだとSkyboxになっているので、これをDepthOnlyに切り替え。

切り替えると、こんな感じで表示出来ていなかった片側のレイヤーの結果が表示できるようになります。

レイヤーごとのソート順序は、ClearFlagsがDepthOnlyになっている場合
カメラの「Depth」の数値でどちらが前に来るかが決定します。

Depthの数字が多い方が前にくるので、それによって重ねる順序を制御してあげればOK。

やり方は分かったのですが、オブジェクトをレイヤーに入れたりカメラの制御だったりとか諸々考えると手でやるの面倒くさそう…選択している者のグループをまとめて入れ替えたりとか
作れば実用的かな(すでにありそうだけど)

基本的なUnityの仕様がやっぱりまだ理解しきれてないなぁ…難しい

やってて気になったこと。
レンダーテクスチャのアスペクト比は、カメラのTargetTextureにアサインしたあとだと変更出来ない。
例えば、デフォルトでは256*256サイズのレンダーテクスチャをカメラにアタッチすると、
比率が1:1の四角いテクスチャになります。
その後、RenderTextureのSizeの値を1280*720にすると、

こんな感じに四角が引き延ばされてしまう。
比率を正しくしたい場合は、一度カメラのレンダーテクスチャを外してアタッチし直すと

正しい比率に戻ります。
最初、レンダーテクスチャの解像度指定とかどうするんだろう?なんか比率おかしくなるんだけど?
と思ってましたが、アタッチし直せばOKというだけの話でした。ワカラナイヨコンナノ!!

 

参考

http://naichilab.blogspot.jp/2013/07/unity.html

https://qiita.com/r-ngtm/items/f8efedb6c81ae8b4c9ce

One comment

コメントを残す

メールアドレスが公開されることはありません。

*