ゼロからはじめるUnityでVJ | 各シーンの映像をRenderTextureに書き出す
※ 2019年時点での検証内容になります。
前回の投稿から、約2ヶ月が過ぎました。
気がつけばすっかり秋に。さてさて、真夏から秋の間、何もしていないかったわけではなく、UnityでVJ環境の構築を着々と進めまして、ほぼ終わりの状態が見えてきました。
制作を進める中でいくつかの Tips が見えてきたので、複数回に分けて、こちらに記録を残していこうと思います。
ここでは、前回の投稿でも触れていたように、Shader を活用したシーン重畳について紹介する前に「各シーンの映像をRenderTextureに書き出す」方法について触れておきます。
shaderでのシーン重畳については以下の先駆者の方のブログと github を参考にさせていただきました。
全体構成の振り返り
手書きで適当に書いていた全体構成を書き直しました。
実現したいことを抽象化すると以下のようになります(実際には、サブゴールにぶら下がる形でいくつかの機能も実装しています)
- ゴール:音楽に反応して動的に変化する映像を手動入力により重ね合わせて表示。
- サブゴール1:オーディオに動的に反応する映像を作る
- サブゴール2:各シーンの映像をRenderTextureに書き出す
- サブゴール3:各シーンのRendertextureを重畳してカメラ映像として描画する
これらのゴールを実現するために、先程の先駆者の方の知見を元に以下の構成でVJする環境を構築しました。
今回の投稿では、サブゴール2と3について解説したいと思います。
動作環境は以下のバージョンとなります。
- 2019.2.5f1
今回、構築した環境で各シーンを作り込むことで以下のような映像を作ることができます。
やりたいことはいくつかのシーンの映像を RenderTexture として書き出して、複数の RenderTexture を shader を使って重畳処理するということです。
では、どうやって実現するのか?
ここでは Camera.targetTexture で取得したシーン内のカメラの映像を予め用意した RenderTexture に出力するスクリプト「Sub Scene Controller.cs」を書きました(下記をご参考に)
シーンに「シーン名+Root」という空のオブジェクトを作成の上、カメラや他のオブジェクトをすべて「シーン名+Root」配下にした上で、「Sub Scene Controller.cs」を「シーン名+Root」にアタッチします. で、書き出したい映像を撮っているカメラと予め用意したRenderTextureをインスペクター上で「Sub Scene Controller.cs」に設定します。
各シーンのカメラ映像を書き出しする RenderTexture を用意した上で上記のスクリプトによりカメラ映像を書き出しするようにすると、以下のように実行中に各シーンの映像が各 RenderTexture に書き出しされるようになります。
次の投稿では、いよいよ「shaderによるシーン重畳」の実現方法を解説していきたいと思います。
ここまでできると後はシーンの作り込みやシーンの切り替えを詰めていけばうまいことVJ環境を構築することができます。