見出し画像

[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で確認できます。

画像1

■キーワードはどうやって設定される?

このKeyword、多くはUnity側でLightの環境など状況に合わせて勝手に指定して行うのですが…。
開発者側でも、設定する手段がいくつかあります。
・Material.EnableKeywrodを利用してMaterial単位で、keywordを有効にします
・Shader.EnableKeywordで、アプリケーション全体でkeywordを有効にする

画像2


※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に続きます。

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