見出し画像

ShaderVariant StrictShaderVariantMatching の設定

ShaderVariant関連でUnity2022から「StrictShaderVariantMatching」という設定があったので、こちらについて記事にします

以前の記事で「AssetBudle化したとき等にShaderVariantがStripされてしまって、見た目が違う状況になってしまうことがある」という話をしました。

AssetBundle化してロードすると見た目が異なってしまう例

これはUnityがオブジェクトを描画するときに、一致するVariant(キーワードの組み合わせ)が見つからなかったときに、なんとなく近いものにフォールバックするという挙動をしているためです。

この「なんとなく近いものにフォールバックして描画する」ということをせず、エラーならエラーとしてちゃんと出してほしいというときに設定するのが、「StrictShaderVariantMatching」です。

PlayerSettingsにあるStrictShaderVariantMatchingの設定

この設定を有効化すると、一致するVariantが含まれていない場合にエラーのピンクとなり、下記のようなエラーメッセージを書き出すようになります。

StrictShaderVariantMatchingによるエラー
Shader Shader Graphs/TestShader, subshader 0, pass 3, stage pixel: variant _FRAGMENT_KEY not found.

これでShaderVariantのミスマッチがあったのが一目瞭然になってきます。

しかし、ログにあるのではなくプログラムでなんかいい感じにキャッチしたいものです。Unityには、Application.logMessageReceivedThreadedというログ書き出しをフックできるAPIがあるので、これを利用すればなんかいい感じにできそうです。

ということでなんとなく書いてみたのがこちらです。

このようにすることで、動いているランタイム上でVariantがミスマッチした状況を知ることができます。

この機能は、ShaderVariantを厳密に運用したいプロジェクトには役に立つ機能になってきます。
ShaderVariantを多くStripすることで、ビルド時間やランタイム時のメモリ使用量を節約することができます。しかしStripしすぎると、今度は逆に見た目の問題がビルドしたアプリケーションでのみ発生することになります。
Stripしすぎたものを見つける方法として、今回のStrictShaderVariantMatchingはお役に立つと思います。

Releaseビルドでも動きましたので、例えばQAのタイミングでStripしすぎた情報をサーバーに上げて自動収集するといったことも使えると思います。

関連記事


この記事が気に入ったらサポートをしてみませんか?