シェーダー基礎、[Toggle]でShaderVariant

シェーダー基礎、[Toggle]でShaderVariant

Unityシェーダーの基礎知識。
[Toggle]を使ってShaderVariantの実装、シェーダーのコード分岐。

関連ページ
前回のページ では
[KeywordEnum]
を使ってShaderVariantを実装し、1つのシェーダーに3つの異なった効果を載せました。
しかし3つでは無く2つの効果を載せる場合は、
[Toggle]
を使った方がもっと分かり易く簡易なコードになります。

シェーダー概要

今回作成したシェーダーの内容は以下の通りです。
Inspectorの
Use Silhouette
のオンオフを切り替えることで、シルエットの有効/非有効が切り替わります。

コードの中身が違うだけで、実装結果は 前々回のページ の[MaterialToggle]と全く一緒です。
([MaterialToggle]はShaderVariantを使わないトグルの実装です)

コード全文

下が今回のテストのコード全文です。
前回との変更点は主に
Properties
shader_feature
の部分です。
Shader "UI/TestVariant2"
{
    Properties
    {
        
//Toggleの()内の文字列がShader Variantのキーワードになる

        [Toggle(_USE_SILHOUETTE_ON)] _UseSilhouettes("Use Silhouette", Float) = 0
    }

    SubShader
    {
        Tags { "Queue" = "Transparent" }
        Cull Off
        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha
    
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            
//Shader Variantの宣言

            #pragma shader_feature_local _USE_SILHOUETTE_ON

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"                

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
                half4 color : COLOR;
            };

            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
                half4 color : COLOR;
            };

            
//uGUI Image > Source Imageにアタッチされた画像を参照する

            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);

            Varyings vert (Attributes input)
            {
                Varyings output;
                output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                output.uv = input.uv;
                output.color = input.color;
                return output;
            }

            half4 frag (Varyings input) : SV_Target
            {
                half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);

//キーワードの有無で処理を分岐させる

#if defined(_USE_SILHOUETTE_ON)
                    
//チェックONの時だけ実行される処理

                    col.rgb = half3(0.5, 0.5, 0.5);
#else
                col *= input.color;
#endif
                return col;
            }
            ENDHLSL
        }
    }
}

コード解説

シェーダー効果が2つしか無いなら、実際のところキーワードの定義は1つで十分です。
#if文では、そのキーワードが選択されてるか否かを見れば事足ります。

まずPropertiesの中を見てみます。
    Properties
    {
        
//Toggleの()内の文字列がShader Variantのキーワードになる

        [Toggle(_USE_SILHOUETTE_ON)] _UseSilhouettes("Use Silhouette", Float) = 0
    }
[Toggle]
内の()の中身を
ドロワー引数
と呼びます。
ここにトグルがオンになった時のキーワードを定義しておきます。

shader_feature
の方にもドロワー引数と同じキーワードを宣言させます。
            
//Shader Variantの宣言

            #pragma shader_feature_local _USE_SILHOUETTE_ON

最後にピクセルシェーダーの方で遷移分けして実装完了です。
            half4 frag (Varyings input) : SV_Target
            {
                half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);

//キーワードの有無で処理を分岐させる

#if defined(_USE_SILHOUETTE_ON)
                    
//チェックONの時だけ実行される処理

                    col.rgb = half3(0.5, 0.5, 0.5);
#else
                col *= input.color;
#endif
                return col;
            }
0
0