Shader实现UI按钮变灰的方法

发表于2018-05-28
评论0 4.7k浏览
按钮变灰变暗变黑白是游戏UI常用的操作,下面就和大家介绍下如何使用shader使UI按钮变成灰色。

代码如下:
Shader "Custom/Gray"   
{  
    Properties  
    {  
        [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}  
        _Color("Tint", Color) = (1, 1, 1, 1)  
        _StencilComp("Stencil Comparison", Float) = 8  
        _Stencil("Stencil ID", Float) = 0  
        _StencilOp("Stencil Operation", Float) = 0  
        _StencilWriteMask("Stencil Write Mask", Float) = 255  
        _StencilReadMask("Stencil Read Mask", Float) = 255   
        _ColorMask("Color Mask",Float) = 15  
    }  
    SubShader  
    {  
        Tags  
        {  
            "Queue" = "Transparent"  
            "IgnoreProjector" = "True"  
            "RenderType" = "Transparent"  
            "PreviewType" = "Plane"  
            "CanUseSpriteAltas" = "True"  
        }  
        Stencil  
        {  
            Ref[_Stencil]  
            Comp[_StencilComp]  
            Pass[_StencilOp]  
            ReadMask[_StencilReadMask]  
            WriteMask[_StencilWriteMask]  
        }  
        Cull Off   
        Lighting Off   
        ZWrite Off   
        ZTest[unity_GUIZTeseMode]  
        Blend SrcAlpha OneMinusSrcAlpha  
        ColorMask[_ColorMask]  
        Pass   
        {  
            CGPROGRAM  
            #pragma vertex vert   
            #pragma fragment frag   
            #include "UnityCG.cginc"  
            struct appdata_t   
            {  
                float4 vertex :POSITION;  
                float4 color :COLOR;  
                float2 textcoord : TEXCOORD0;  
            };  
            struct v2f   
            {  
                float4 vertex : SV_POSITION;  
                fixed4 color : COLOR;  
                half2 texcoord : TEXCOORD0;  
            };  
            fixed4 _Color;  
            v2f vert(appdata_t IN)  
            {  
                v2f OUT;  
                OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);  
                OUT.texcoord = IN.textcoord;  
            #ifdef UNITY_HALF_TEXEL_OFFSET  
                OUT.vertex.xy += (_ScreenParams.zw - 1.0) * float2(-1, 1);  
            #endif   
                OUT.color = IN.color * _Color;  
                return OUT;  
            }  
            sampler2D _MainTex;  
            fixed4 frag(v2f IN) : SV_Target   
            {  
                half4 color = tex2D(_MainTex, IN.texcoord) * IN.color;  
                clip(color.a - 0.01);  
                half3 temp = dot(color.rgb,fixed3(.222, .707,.071));  
                return half4(temp.r, temp.g, temp.b, color.a);  
            }  
            ENDCG  
        }  
    }  
}  

效果如图:
右边的是正常图,左边的是效果图

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引