![見出し画像](https://assets.st-note.com/production/uploads/images/26253474/rectangle_large_type_2_909c344db48b6c78d6a2866e3932b6d8.png?width=1200)
[Unity]ShaderVariantについて~前編:ShaderVariantとは?~
今回はShaderVariantについて、書き起こしたいと思います。
前編では、ShaderVariantとは何なのか?
中編では、AssetBundleとShaderVariantの関係
後編では、ShaderVariantと最適化周りについて述べていきたいと思います。
■まずShaderVariantについてです
1つのシェーダーは色んなシチュエーションで使いたい。
そういう時のために、 ShaderVariantがあります。
例えば、Unityの内部でも、様々な光源環境でも1つのシェーダーで使えるようにShaderVariantの仕組みを多用しています。
Directionalライトが1つだけの環境、Directional LightとPointLightが2つある環境、ライトマップの有無など様々な環境で、最小限のライティング計算で抑えるために複数のバリエーションの実体を1つのShaderとして扱っています。
■実装方法について
Shader内では下記のような形でキーワード定義を行い、複数のバリエーションを持たせることが可能です。
// _ADDITIONAL_LIGHTS のありバージョン、なしバージョン
#multi_compile _ _ADDITIONAL_LIGHTS
// 何らかの処理...
#if _ADDITIONAL_LIGHTS
// _ADDITIONAL_LIGHTが有効の時だけ処理します
#endif
上で説明している 「_ADDITIONAL_LIGHTS」の事を keywordと呼びます。
「どのkeywordを有効にするか?」この組み合わせの数だけ実体がある形になります。
この組み合わせの数が多ければ多いほど、ビルド時に時間もかかりますし、実行時のメモリ使用量も多くなります。
※Unityでは、これを何となくいい感じに汲み取って、使われていそうなものだけビルドの対象とします。
何となくイイ感じなので、完ぺきではありません。この辺りに最適化の余地があるのですが、それは最後の後編で述べたいと思います。
■現在利用されているShaderVariantを確認するには?
ちなみに、今現在 Shaderのどのkeywordが有効になっているかは、UnityのFrameDebuggerで確認できます。
■キーワードはどうやって設定される?
このKeyword、多くはUnity側でLightの環境など状況に合わせて勝手に指定して行うのですが…。
開発者側でも、設定する手段がいくつかあります。
・Material.EnableKeywrodを利用してMaterial単位で、keywordを有効にします
・Shader.EnableKeywordで、アプリケーション全体でkeywordを有効にする
※MaterialのKeywordを確認するにはInspectorをDebugにすると確認できます
■どれだけのShader Variantがあるか確かめる方法
「一つのShaderで、どれだけの組み合わせのKeywordがあるか」
これはInspector上で確認が出来ます。
Compile and show codeの右側で、メニューを開いて確認が可能です。
Skip unused shader_featuresのチェックのオンオフでUnityが自動で省いた後の話なのか、それとも全てのVariantなのかを選択できます。
■まとめ
このように、複数のシチュエーションでも、1つのShaderで対応するためにkeywordでバリエーションを作るのがShaderVariantでした。
※補足1:#pragma multi_compie以外にも、#pragma shader_featureという書き方も出来ます。
違いについてはUnityのマニュアル「複数のシェーダープログラムのバリアントを作る」を確認してください
※補足2:ShaderVariantがどういうときに役立つかの一例として、SEGA社がブログで技術記事を公開しております。
そんな感じで、中編の、AssetBundleとShaderVariantに続きます。
この記事が気に入ったらサポートをしてみませんか?