ShaderVariantCollectionを良い感じに生成できないか…
これまでのあらすじ…
UnityのShaderVariantについてコレまで記事を書いていたのですが、自分が思った以上に閲覧されているようでした。
今回紹介したいもの
そして、ふと思ったのです…
記事中に紹介したShaderVariantCollectionアセット…もうちょっと楽に生成できないかなぁと…
具体的には…
「Editor上でプレイを繰り返ししていたら…
利用したShaderVariantが勝手に記録されていって…
あとは溜め込んだ記録をもとに良い感じにShaderVariantCollectionアセットを作ってくれる…」
というのを理想とします。
と言う事でこの理想をもとに作ったのがコチラです。
実現方法について
Shaderコンパイルが走った際に、実行時にShader.CreateGPUProgramという形でどのShaderをどういうKeywordでコンパイルが走ったかがわかるようになっています。
これをキャッチできれば良さそうです。
実行しながら良い感じに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を作成しました
この記事が気に入ったらサポートをしてみませんか?