Unity エディターでは、マテリアル Inspector でマテリアルを表示し、マテリアルのローカルシェーダーキーワードを有効にしたり無効にしたりすることができます。これは 2 つの理由で有効です。
[KeywordEnum] MaterialPropertyDrawer を使用してキーワードを有効にすると、Unity は自動的にセット内の他のキーワードを無効にします。これにより、常に 1 つのセット内で厳密に 1 つのキーワードが有効になります。他のシェーダー設定やデータの場合と同様に、シェーダーキーワードは、シェーダーソースファイル内でマテリアルプロパティとして宣言されている場合にのみ、マテリアル Inspector で使用できます。
Shader Graph で作成されたシェーダーの場合、キーワードはデフォルトでマテリアルのプロパティです。つまり、これらの設定は自動的にマテリアル Inspector で使用可能です。これを変更するには、Blackboard を開き、Exposed プロパティを変更します。
ハンドコーディングされたシェーダーの場合は、ShaderLab コードがキーワードセットを表すマテリアルプロパティを定義することを確認する必要があります。マテリアルプロパティに Float タイプが設定されており、Inspector に正しく公開するために [Toggle]、[ToggleOff]、または [KeywordEnum] MaterialPropertyDrawer 属性を使用する必要があります。
以下の例では、Make Red というトグルを追加し、キーワード _RED_ON を有効または無効にします。
Shader "Unlit/ToggleRed"
{
Properties
{
[Toggle] _RED ("Make red", Float) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// Add the keyword RED_ON, for when the toggle is on
// Unity automatically adds a keyword for when the toggle is off
#pragma shader_feature _RED_ON
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// Return red if the toggle is on
#if _RED_ON
return fixed4(1, 0, 0, 1);
#else
return fixed4(0, 0, 0, 1);
#endif
}
ENDCG
}
}
}
詳細および例については、MaterialPropertyDrawer API のドキュメントを参照してください。