ネコのために鐘は鳴る

寺院に住み着くパソコ〇好き

Unity2021以前のURPのシェーダーで "RenderPipeline" のタグがバグってる件について

Unity2021でURPのシェーダーを公式ドキュメント通りに書いて、Unity2022にアップデートするとバグります。描画されません。

何が悪いかというと、Tags の中に "RenderPipeline" = "UniversalRenderPipeline" と書くとおかしくなります。

Tags {
    "RenderPipeline" = "UniversalRenderPipeline"
}

と書くとおかしくなります。

正しくは

Tags {
    "RenderPipeline" = "UniversalPipeline"
}

です。どこのページだったか忘れましたが、Unity の公式リファレンスのサンプルコードが間違っていたし、他の第三者のいろんな記事で間違った方が書かれていたりします。(公式が間違ってるんだから仕方ない)

どうやら Unity がバグっていて、どんな名前が指定されていても無視され、全て UPR 用として認識されていたらしい。そして、"UniversalRenderPipeline" と公式が間違えていたのでそれが広まった。間違ったタグなのに Unity がタグを無視するバグのせいで、URP 用として認識されてしまう。

ここまでなら皆気づかず動いていたからよかったのだが、どうやら Unity2022 のどこかのバージョンでタグが無視されてしまうバグが修正された。 すると、間違ったタグ "UniversalRenderPipeline" を書いているシェーダーは URP 用として認識されないのでバグる。

「Unity2021までは "UniversalRenderPipeline" で、Unity2022以降は "UniversalPipeline" に変更された」という情報も見つけたのだが、これはたぶん正しくない。2021以前も "UniversalPipeline" が正しくて、Unity のバグのせいで間違ったタグでも URP 用として認識されていただけ。

つまり、結論として、Unity のバージョンによらず、URP 用のシェーダーには

Tags {
    "RenderPipeline" = "UniversalPipeline"
}

と書くのが正しい。

参考

https://discussions.unity.com/t/renderpipeline-tag-changed/925179/5

Ok, at least for URP it’s not so bad. Via the shader discord, Cyan told me that the tag was always UniversalPipeline, it’s just that a bug in previous versions would incorrectly also render UniversalRenderPipeline. That bug is detailed here - the renderer was ignoring filtering via the draw tag Opaque forward render pass renders shaders that are defined as incompatible w/URP

So for URP, you can have compatibility with both future and past versions - you need to change UniversalRenderPipeline to UniversalPipeline and it will work with both old and new versions (I tested on 2021). The tag value didn’t change, it just was not respected beforehand.

雑な意訳「タグは常に UniversalPipelineで、以前のバージョンにはバグがあっただけ。だから UniversalPipeline と書けばどっちのバージョンでもちゃんと動くよ。2021で試した。タグの値が変わったわけじゃない、以前はタグが機能してなかっただけ」