// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' 
 | 
  
 | 
Shader "GUI/ImageSmoothMask" 
 | 
{ 
 | 
    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 
 | 
  
 | 
        _LeftBottom("Left Bottom", Vector) = (0, 0, 0, 0) 
 | 
        _RightTop("Right Top", Vector) = (0, 0, 0, 0) 
 | 
        _SmoothRect("SmoothRect", Vector) = (0, 0, 0, 0) 
 | 
    } 
 | 
  
 | 
        SubShader 
 | 
        { 
 | 
            Tags 
 | 
            { 
 | 
                "Queue" = "Transparent" 
 | 
                "IgnoreProjector" = "True" 
 | 
                "RenderType" = "Transparent" 
 | 
                "PreviewType" = "Plane" 
 | 
                "CanUseSpriteAtlas" = "True" 
 | 
            } 
 | 
  
 | 
            Stencil 
 | 
            { 
 | 
                Ref[_Stencil] 
 | 
                Comp[_StencilComp] 
 | 
                Pass[_StencilOp] 
 | 
                ReadMask[_StencilReadMask] 
 | 
                WriteMask[_StencilWriteMask] 
 | 
            } 
 | 
  
 | 
            Cull Off 
 | 
            Lighting Off 
 | 
            ZWrite Off 
 | 
            ZTest[unity_GUIZTestMode] 
 | 
            Blend SrcAlpha OneMinusSrcAlpha 
 | 
            ColorMask[_ColorMask] 
 | 
  
 | 
            Pass 
 | 
            { 
 | 
                CGPROGRAM 
 | 
                #pragma target 3.0 
 | 
                #pragma vertex vert 
 | 
                #pragma fragment frag 
 | 
                #include "UnityCG.cginc" 
 | 
  
 | 
                float2 _LeftBottom; 
 | 
                float2 _RightTop; 
 | 
                float2 _SmoothRect; 
 | 
  
 | 
                float2 SelfUVCalculate(float2 vertex) 
 | 
                { 
 | 
                    float length = abs((_LeftBottom - _RightTop).x); 
 | 
                    float height = abs((_LeftBottom - _RightTop).y); 
 | 
                    float2 pos = vertex - _LeftBottom; 
 | 
  
 | 
                    return float2(pos.x / length, pos.y / height); 
 | 
                } 
 | 
                float MaskCalculate(float a, float2 uv) 
 | 
                { 
 | 
                    a *= uv.x < _SmoothRect.x ? smoothstep(0, 1, uv.x / _SmoothRect.x) : 1; 
 | 
                    a *= uv.x > (1 - _SmoothRect.x) ? smoothstep(0, 1, (1 - uv.x) / _SmoothRect.x) : 1; 
 | 
                    a *= uv.y > (1 - _SmoothRect.y) ? smoothstep(0, 1, (1 - uv.y) / _SmoothRect.y) : 1; 
 | 
                    a *= uv.y < _SmoothRect.y ? smoothstep(0, 1, uv.y / _SmoothRect.y) : 1; 
 | 
  
 | 
                    return a; 
 | 
                } 
 | 
  
 | 
                    struct appdata_t 
 | 
                    { 
 | 
                        float4 vertex   : POSITION; 
 | 
                        float4 color    : COLOR; 
 | 
                        float2 texcoord : TEXCOORD0; 
 | 
                    }; 
 | 
  
 | 
                    struct v2f 
 | 
                    { 
 | 
                        float4 vertex   : SV_POSITION; 
 | 
                        fixed4 color : COLOR; 
 | 
                        half2 texcoord  : TEXCOORD0; 
 | 
                        float4 texcoord1: TEXCOORD1; 
 | 
                    }; 
 | 
  
 | 
                    fixed4 _Color; 
 | 
  
 | 
                    v2f vert(appdata_t IN) 
 | 
                    { 
 | 
                    v2f OUT; 
 | 
                    OUT.vertex = UnityObjectToClipPos(IN.vertex); 
 | 
                    OUT.texcoord = IN.texcoord; 
 | 
                    OUT.texcoord1 = IN.vertex; 
 | 
                    #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; 
 | 
  
 | 
                    bool IsInRect(float2 pos) 
 | 
                    { 
 | 
                        if (pos.x > _LeftBottom.x && pos.x < _RightTop.x && pos.y > _LeftBottom.y && pos.y < _RightTop.y) 
 | 
                        { 
 | 
                            return true; 
 | 
                        } 
 | 
                        return false; 
 | 
                    } 
 | 
  
 | 
                    fixed4 frag(v2f IN) : SV_Target 
 | 
                    { 
 | 
                    half4 color = tex2D(_MainTex, IN.texcoord) * IN.color; 
 | 
                    float4 worldPos = mul(unity_ObjectToWorld, IN.texcoord1); 
 | 
                    color.a = IsInRect(worldPos) ? 1 : 0;      //MaskCalculate(color.a, SelfUVCalculate(IN.texcoord1)); 
 | 
                    // clip(color.a - 0.01); 
 | 
                    return color; 
 | 
                    } 
 | 
  
 | 
                    ENDCG 
 | 
                } 
 | 
  
 | 
             
 | 
        } 
 | 
} 
 |