Unityにおいて、(深度バッファを使用する設定であれば)シェーダで_CameraDepthTexture
と宣言することで深度バッファを参照することができます。
これはURPにおいて、CopyDepthPass
と呼ばれるパスでレンダリング中の深度バッファを_CameraDepthTexure
にコピーする処理と、シェーダに対してこの深度バッファを渡すようなSetGlobalTexture
が呼ばれているためです。
実際にシーン中のメッシュなどを描画する際に深度を書きこんでいる先は_CameraDepthAttachment
というテクスチャなのですが、このパスのタイミングで_CameraDepthAttachment
から_CameraDepthTexture
へのコピーが実行されます。
基本的には画面の描画は
- 不透明オブジェクトの描画
- 深度バッファの
_CameraDepthTexture
へのコピー - 透明オブジェクトの描画
の順で実行され、3のシェーダで_CameraDepthTexture
を使用するのが普通なので、普段は特に意識することは無いと思います。
でも、URPでオレオレカスタマイズをする際にはちゃんと意識するようにしましょう。
オレオレレンダリングの場合は透明不透明の垣根すら壊せてしまいますからね。
ちなみに、CopyDepthPass
の実行タイミングはURPの設定インスタンスでちょっと変更できます。
また、CopyDepthPass
のcsコードや使用しているシェーダは公開されているので、同じようなコードを書いてやれば深度情報を好きなように利用できます。
結局はレンダリングパイプラインなんてものは
- カメラ空間内のメッシュ情報をテクスチャに描きこむ
- テクスチャ自体を操作する
の組み合わせでしかないので、この辺のAPIが公開されているならばかなり自由に改造できることがわかりますね。
とはいえ使用するテクスチャが多くなりすぎないように管理することは重要です。RenderTextureは解像度次第ですがかなりメモリを食いますので。