見出し画像

ShaderVariantCollectionを良い感じに生成できないか…

これまでのあらすじ…

UnityのShaderVariantについてコレまで記事を書いていたのですが、自分が思った以上に閲覧されているようでした。

今回紹介したいもの

そして、ふと思ったのです…
記事中に紹介したShaderVariantCollectionアセット…もうちょっと楽に生成できないかなぁと…

具体的には…
「Editor上でプレイを繰り返ししていたら…
利用したShaderVariantが勝手に記録されていって…
あとは溜め込んだ記録をもとに良い感じにShaderVariantCollectionアセットを作ってくれる…」
というのを理想とします。

と言う事でこの理想をもとに作ったのがコチラです。

実現方法について

Shaderコンパイルが走った際に、実行時にShader.CreateGPUProgramという形でどのShaderをどういうKeywordでコンパイルが走ったかがわかるようになっています。
これをキャッチできれば良さそうです。

画像1

実行しながら良い感じにProfilerの情報を持ってくるためには下記の ProfierのNativePlugin用のインターフェース「IUnityProfilerCallbacks」を利用することで実行時に Shader.CreateGPUProgramの情報を得られます。

この得た内容をログとしてファイルに書き出すことで、どのようなVariantを利用しているか把握できそうです。
そして、このログからShaderVariantCollectionを作ってしまえば、完成です!!!

これで出来そうだ!と思ったのですが、ShaderオブジェクトがどのVariantをコンパイルしていたかを保持してしまっています。
これはEditorで実行中はShaderの破棄等を行われない限りキャッシュしてしまいます。これではEditor上でプレイした際にRuntimeと同じようにCreateGPUProgramをしてくれそうにありません。。。。

そこでPlay開始時のコールバックでShaderキャッシュをクリアするようにしました。

ShaderUtil.ReloadAllShaders というInternal 用のAPIをReflection経由で呼び、Library/ShaderCacheもクリアすることにしました。

これで無事プレイするごとにCreateGPUProgramが走るようになりました。

追記:ShaderVariantCollectionの番外編2を作成しました


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