| // 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 | 
|                 } | 
|   | 
|              | 
|         } | 
| } |