UniversalRP(URP12)で自作シェーダーをオブジェクトに適応すると正常に表示されず透明になってしまう現象についてです。
Unity 2021.3
UniversalRP 12.1
Forward
前提
当たり前ですが、シェーダー自体は間違っていないものとします。
表示されるはずのものが表示されない、という観点で話を進めます。
結論
現状確認できているのは
Depth Priming Mode が Auto もしくは Forced の場合に表示されない
という状態です。
ここでちょろっとお話していますが、Depth Priming Mode の仕業です。
なのでこれを Disabled へ変更してあげると正常に描画されると思います。
Depth Priming Mode とは
調べました。
自分的にはここからが本題です。
エディタ項目のToolTipには
With depth priming enabled, Unity uses the depth buffer generated in the depth prepass to determine if a fragment should be rendered or skipped during the Base Camera opaque pass.(一部抜粋)
との記述があります。
簡単に訳すと、
Depth Prepassとは
Depth Prepassってなんぞやという話ですが、通常のレンダリングではZバッファとカラーバッファを同時に描画しますが、Zバッファを先に生成することでオーバードローの負荷を減らす役割を担っており、内部的にはピクセルシェーダー(フラグメントシェーダー)の実行回数を減らす処理になっているようです。
最近のGPUにはDepth Prepassを高速で処理できる機能が備わっているため、Depth Prepassを使用したDepthを使用すると、Depth情報の生成に特化している処理を使うため高速化が見込める訳です。
無論、制約がありますが。
なぜ自作シェーダーが描画されない?
正直に言います。
今の私では分かりません。
Depth PrepassがDepthを生成する時点でこちらの自作シェーダーが走っていないからでは? と推察してますが、推察の域を出ません。
なのでDepth PrepassがDepthを生成する前にこちらがDepthを書き込めば良いのでは? とも思っています。
これも推察の域を(以下略
追々調べてみようと思っています。
今回はここまでです。
ありがとうございました。