-->

Unity UIシルエット化シェーダー

Unity UIシルエット化シェーダー

[Unity URP] UIシルエット化シェーダー(UI Silhouette Color Shader)。
画像を単一色に変更する方法。

関連ページ
たぶん最も実装が簡単なシルエット化シェーダー。ただ実装が簡単なわりに結構恩恵が高いと思います。
このシェーダーがあれば、例えばユーザーが未取得のメダルをシルエットで表示したい時などに、デザイナーに新たに画像を発注する必要がなくなります。
ソシャゲでは割とあるあるな場面だと思う。
似たような機能の グレースケール化シェーダー も併せてどうぞ。

※コードが古くなっていたのでURP用に記事を改修しました(2026/03/20)。

シルエット化シェーダー概要

マテリアルの
BlendRate
のスライダーで、シルエット率を0から1までのfloat値で指定できます。
また
Color
の値をいじるとシルエットの色を変更できます。

コード全文

以下シルエット化シェーダーの全文です。uGUI Imageへの反映方法は こちらの記事 参照してください。
基礎知識として次の記事にも目を通すと分かり易いです。 p.59 : シェーダー基礎、最もシンプルなuGUI用 URP Shader
Shader "UI/SilhouetteColor"
{
    Properties
    {
        _BlendRate ("BlendRate", Range(0.0, 1.0)) = 1
        _Color("Color", Color) = (1, 1, 1, 1)
    }

    SubShader
    {
        Tags
        {
            "RenderPipeline" = "UniversalPipeline"
            "Queue" = "Transparent" 
        }
        Cull Off
        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha 

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"    

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

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

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

            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);

            
//SRP Batcherを適用

            CBUFFER_START(UnityPerMaterial)
                
//今回追加したプロパティに対応する変数

                half _BlendRate;
                half4 _Color;
            CBUFFER_END

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

            half4 frag (Varyings input) : SV_Target
            {
                half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
                col *= input.color;
                col.rgb = lerp(col.rgb, _Color.rgb, _BlendRate);
                return col;
            }
            ENDHLSL
        }
    }
}

コード解説

ピクセルシェーダーだけ解説します。
            half4 frag (Varyings input) : SV_Target
            {
                half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
                col *= input.color;
                col.rgb = lerp(col.rgb, _Color.rgb, _BlendRate);
                return col;
            }
col
がその画像本来のピクセル色、
_Color
がプロパティから指定したシルエットの色です。

たとえば指定したinput.uv座標のピクセル色、colが(1, 0, 0, 1)の赤色だとして、_Colorが(0.5, 0.5, 0.5, 1)の灰色だとします。
式では
col.rgb = lerp(col.rgb, _Color.rgb, _BlendRate);
とあり、a(透明度)は無視してrgbのみの代入をしています。
これに従ってcolの赤と_Colorの灰色を式に代入するとこうなります。
                col.rgb = lerp(half3(1, 0, 0), half3(0.5, 0.5, 0.5), _BlendRate);

lerp
関数は、第三引数が0の時は第一引数の値を返し、第三引数が1の時は第二引数の値を返します。
仮に
_BlendRate
が1の場合は、元の赤色は完全に無視して灰色が表示されます。
逆に
_BlendRate
が0であれば赤色が表示され、0.5であれば赤と灰色の中間色が表示されます。
0
0