ゲーム制作技術録

主にUnity/Godot4関連の技術ブログです

【Unity】【URP】自作シェーダーが表示されない(Depth Priming Mode について)

UniversalRP(URP12)で自作シェーダーをオブジェクトに適応すると正常に表示されず透明になってしまう現象についてです。

Unity 2021.3
UniversalRP 12.1
Forward

そこにいるのに……

前提

当たり前ですが、シェーダー自体は間違っていないものとします。

表示されるはずのものが表示されない、という観点で話を進めます。

結論

現状確認できているのは

Depth Priming Mode が Auto もしくは Forced の場合に表示されない

という状態です。

ここでちょろっとお話していますが、Depth Priming Mode の仕業です。
なのでこれを Disabled へ変更してあげると正常に描画されると思います。

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 Primingが有効の場合はUnityはDepth Prepassで生成されたDepthを使用しますというものです。

Depth Prepassとは

Depth Prepassってなんぞやという話ですが、通常のレンダリングではZバッファとカラーバッファを同時に描画しますが、Zバッファを先に生成することでオーバードローの負荷を減らす役割を担っており、内部的にはピクセルシェーダー(フラグメントシェーダー)の実行回数を減らす処理になっているようです。

最近のGPUにはDepth Prepassを高速で処理できる機能が備わっているため、Depth Prepassを使用したDepthを使用すると、Depth情報の生成に特化している処理を使うため高速化が見込める訳です。

無論、制約がありますが。

logmi.jp

なぜ自作シェーダーが描画されない?

正直に言います。
今の私では分かりません

Depth PrepassがDepthを生成する時点でこちらの自作シェーダーが走っていないからでは? と推察してますが、推察の域を出ません。
なのでDepth PrepassがDepthを生成する前にこちらがDepthを書き込めば良いのでは? とも思っています。
これも推察の域を(以下略

追々調べてみようと思っています。

今回はここまでです。
ありがとうございました。

参考