シャドウマップを自前で作成してみます。
以前カメラからの深度情報を得る方法を書きました。
しかしこの方法は指定したRenderTextureに書き込んだりできないので別の方法で実装します。
深度をRenderTextureにレンダリングする
今回の方法は下記を参考にさせていただきました。
まずシャドウマップとして使用するRenderTextureを作成して、Color FormatをDepthとします。
次にライトのオブジェクトにCameraコンポーネントをアタッチします。
シャドウマップを作成する範囲を描画するように範囲を調整します。
そしてこのCameraのTarget Textureに先ほどのレンダーテクスチャをセットします。
するとこれだけでレンダーテクスチャに深度情報が描画されます。
R値に深度が入ってくるようです。
ちょっとブラックボックスなところがあって細かい仕組みはわかりませんが、ひとまずこの方法でテクスチャに深度を書き込めました。
パフォーマンスが気になる・・
仕組みがいまいちわからないのでFrame Debuggerを見てみます。
下図の赤で囲った部分がライトに付けたCameraによる描画です。
まずSkyboxが描画されているのはCameraのClear FlagをSolid Colorに変更しておくとして、
Mesh複数回描画されているのはなかなか気になります。
今回、すべてのMeshRendererに違うマテリアルを割り当てているのでバッチングされていないわけですが、
Unityがシャドウマップを作るときには、ShadowCasterは異なるマテリアルでもバッチングされるようです。
Unity - Manual: Draw call batching
自前でシャドウマップを作成するときにもなんとかバッチングさせる方法はないものでしょうか・・
何かわかったら追記します。