-->

【Unity Shader 基礎】[Toggle]でShaderVariant

【Unity Shader 基礎】[Toggle]でShaderVariant
 ※このシェーダーはURP環境対応済みシェーダーになります。 

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

シェーダー概要

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

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

コード全文

下が今回のテストのコード全文です。
前回との変更点は主に
 Properties 
 shader_feature 
の部分です。
Copy Code

Shader "UI/TestVariant2"
{
    Properties
    {
        //Toggleの()内の文字列がShader Variantのキーワードになる
        [Toggle(_USE_SILHOUETTE_ON)] _UseSilhouettes("Use Silhouette", Float) = 0
    }

    SubShader
    {
        Tags
        {
            "RenderPipeline" = "UniversalPipeline"
            "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の中を見てみます。
Copy Code

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

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

            //Shader Variantの宣言
            #pragma shader_feature_local _USE_SILHOUETTE_ON

最後にピクセルシェーダーの方で遷移分けして実装完了です。
Copy Code

            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