ゼロからはじめるUnityでVJ |shaderによるシーン重畳について
※ 2019年時点での検証内容のため、内容が古い可能性があります。
ここでは、Shaderによるシーン重畳について触れていきたいと思います。
Unityで、一度、このような環境を作ってしまって、後はシーンさえ作り込めば、いい感じに映像をブレンディングすることができます!自分の場合、キーボード入力に応じてブレンドするシーンの選択をしていますが、ここをMIDIコントローラに近々変えたいなという感じです。
実現したいこと
まずは、実現したいことを振り返っておきます. 前回の投稿「ゼロからはじめるUnityでVJ | 各シーンの映像をRenderTextureに書き出す」でも触れたのですが、最終ゴールは「音楽に反応して動的に変化する映像を手動入力により重ね合わせて表示する」です。
そのために、「オーディオに動的に反応する映像を作る」「各シーンの映像をRenderTextureに書き出す」「各シーンのRendertextureを重畳してスクリーンに表示する」の3点のサブゴールを設定しました。 ここでは、「各シーンのRendertextureを重畳してカメラ映像として描画する」の実現方法について、ざっと紹介したいと思います。
shaderで各シーンのRenderTextureを重畳表示する方法
さて、本題に入っていきます. 各シーン(以下、サブシーンと呼びましょう)をどのようにして重畳するのか?
基本的には、以下の3ステップで実現させます。
- 「サブシーンのRenderTextureをMainシーンで受け取りshaderに渡す」
- 「shaderでサブシーンのRenderTextureを重畳する」
- 「メインシーンのカメラに描画する」
サブシーンの RenderTexture を Main シーンで受け取り shader に渡す
まずはこれですが、Mainシーンのカメラに以下のスクリプト(ここでは”MixCameraController.cs”とする)をアタッチします.
何をしているかと思うと、インスペクタで設定された RenderTexture を Shader の sampler2D(2次元テクスチャ)として扱えるようにしておきます。後々、任意の RenderTexture(shader 上では sampler2D)のみ shader でブレンディングするためにSetchannelGain 関数を用意しておきます。
shaderでサブシーンのRenderTextureを重畳する
以下はシーン重畳に使う shader( mixshader と呼ぶことにする)になります(ここでは6シーン分を重畳できるようにしたかったので _Chan1~6 まであります)
上述した「MixCameraController」において、SetTextureで渡したRenderTextureはshader内でsampler2Dとして扱えるようになります. で、ここでは、tex2D関数を使って各sampler2Dのピクセル情報を取得し、色情報を加算します(たぶん)
ちなみに、「MixCameraController」において
_material.SetFloat(Gain + chan.ToString(), value)
として、_Gainを渡しており、_Gainが1であれば、
col += tex2D(_Chan_1, i.uv) * _Gain_1;
ここで加算されるので、表示されるようになります。
メインシーンのカメラに描画する
ここは「MixCameraController」に既に書いているように、OnRenderImage関数で描画します。
例えば「MixCameraController」で定義した SetchannelGain 関数を別のスクリプトでシーン番号と channel 番号を対応させた上で呼び出してやれば、keyInput に応じて、重畳するシーンを設定する、などが簡単にできそうですね。
さて次は
次は、エフェクトに凝った Volumetric Video をつくるのに興味が出てきたので、depth カメラと VFX Graph の連携についてリサーチしていこうかと思います。