URPのサンプルをみる - saitocastel1900/UnityShader GitHub Wiki
- キューブが常に移動していて、柱と重なると透けるようなエフェクトがかかるようです。ステンシルバッファを使っているのかな
- URPではPipelineアセットで描画に関することを管理するみたい。今まではカメラとかSettingsにあったものがこっちに移行した感じかな
- Pipelineで設定できることとして、Renderingという項目があり、これをRenderDataというもので色々せっているみたい
- そして、RenderDataにはRenderFeatureなるものがあり、ここRender Objectsを追加していくことで、任意のタイミングで処理を追加したり、色々できるみたいです。なので、ここで遮蔽物に関する処理を実装しているみたいです
- サンプルのRenderData>RenderOjectsを見るとなにか追加されていますね。どうやらここでは、Opaque(不透明)な描画順のNotingレイヤーのオブジェクトに対して、Overridesの処理が実行されると。
- Overridesでは、DpethTestをGreaterにしている。これは、キューブの前に遮蔽物があると深度値で表すとキューブ(1.0)で遮蔽物(0.1)のような感じで、深度値がキューブのほうが高くなることを利用して、遮蔽物を検知して描画しているみたい
- 実はこのままだと画像のように、Player間のオブジェクトでもエフェクトが発生してしまうので直したい
- まず、LayerMaskで映らないようにします
- デプスバッファを書き込まないで、深度値比較でエフェクトを描画する。これで、隠れているところだけ、エフェクトが表示される
- 普通に書き込む。これでエフェクトを書き込み後、普通にキューブを描画することで、破綻を防ぐ。なので、描画の順番が重要で、全部書き込み>エフェクトだとエフェクトが上書きするように書き込むため、破綻してしまう
- ちなみに深度値を書き込んだままにすると、このようになります。これは、エフェクトが深度が、その後書き込む通常の描画でZTestを通過してしまい、通常の描画の結果が上書きされることで起こってしまいます