ノートの端の書き残し

UnityやらC#やら。設計が得意かもしれない。

【URP】CopyDepthPass

Unityにおいて、(深度バッファを使用する設定であれば)シェーダで_CameraDepthTextureと宣言することで深度バッファを参照することができます。

これはURPにおいて、CopyDepthPassと呼ばれるパスでレンダリング中の深度バッファを_CameraDepthTexureにコピーする処理と、シェーダに対してこの深度バッファを渡すようなSetGlobalTextureが呼ばれているためです。

実際にシーン中のメッシュなどを描画する際に深度を書きこんでいる先は_CameraDepthAttachmentというテクスチャなのですが、このパスのタイミングで_CameraDepthAttachmentから_CameraDepthTextureへのコピーが実行されます。

基本的には画面の描画は

  1. 不透明オブジェクトの描画
  2. 深度バッファの_CameraDepthTextureへのコピー
  3. 透明オブジェクトの描画

の順で実行され、3のシェーダで_CameraDepthTextureを使用するのが普通なので、普段は特に意識することは無いと思います。

でも、URPでオレオレカスタマイズをする際にはちゃんと意識するようにしましょう。
オレオレレンダリングの場合は透明不透明の垣根すら壊せてしまいますからね。

ちなみに、CopyDepthPassの実行タイミングはURPの設定インスタンスでちょっと変更できます。

また、CopyDepthPassのcsコードや使用しているシェーダは公開されているので、同じようなコードを書いてやれば深度情報を好きなように利用できます。

github.com

github.com

結局はレンダリングパイプラインなんてものは

  1. カメラ空間内のメッシュ情報をテクスチャに描きこむ
  2. テクスチャ自体を操作する

の組み合わせでしかないので、この辺のAPIが公開されているならばかなり自由に改造できることがわかりますね。

とはいえ使用するテクスチャが多くなりすぎないように管理することは重要です。RenderTextureは解像度次第ですがかなりメモリを食いますので。