【Unity】シャドウマップを自前で作成する(ライトからの深度をRenderTextureに描画する)

シャドウマップを自前で作成してみます。
以前カメラからの深度情報を得る方法を書きました。

light11.hatenadiary.com

しかしこの方法は指定したRenderTextureに書き込んだりできないので別の方法で実装します。

深度をRenderTextureにレンダリングする

今回の方法は下記を参考にさせていただきました。

www.shibuya24.info

まずシャドウマップとして使用するRenderTextureを作成して、Color FormatをDepthとします。

f:id:halya_11:20180513225646p:plain

次にライトのオブジェクトにCameraコンポーネントをアタッチします。
シャドウマップを作成する範囲を描画するように範囲を調整します。

そしてこのCameraのTarget Textureに先ほどのレンダーテクスチャをセットします。

f:id:halya_11:20180513225944p:plain

するとこれだけでレンダーテクスチャに深度情報が描画されます。
R値に深度が入ってくるようです。

f:id:halya_11:20180513230110p:plain

ちょっとブラックボックスなところがあって細かい仕組みはわかりませんが、ひとまずこの方法でテクスチャに深度を書き込めました。

パフォーマンスが気になる・・

仕組みがいまいちわからないのでFrame Debuggerを見てみます。
下図の赤で囲った部分がライトに付けたCameraによる描画です。

f:id:halya_11:20180513230659p:plain

まずSkyboxが描画されているのはCameraのClear FlagをSolid Colorに変更しておくとして、
Mesh複数回描画されているのはなかなか気になります。

f:id:halya_11:20180513230934p:plain

今回、すべてのMeshRendererに違うマテリアルを割り当てているのでバッチングされていないわけですが、
Unityがシャドウマップを作るときには、ShadowCasterは異なるマテリアルでもバッチングされるようです。

Unity - Manual: Draw call batching

自前でシャドウマップを作成するときにもなんとかバッチングさせる方法はないものでしょうか・・

何かわかったら追記します。

関連

light11.hatenadiary.com