回答編集履歴

1 コードが誤っていたため差し替え

Bongo

Bongo score 7911

2018/09/07 19:41  投稿

ビルトインシェーダーの`DefaultResourcesExtra/UI/UI-Default.shader`がご参考になりそうです。
この中に、いかにも怪しげな`UNITY_UI_CLIP_RECT`や`_ClipRect`、`UnityGet2DClipping`といったキーワードが出てきますが、どうやらこれらでマスク範囲内かどうかを判定できるようです。
たとえば下記のようにしてみるといかがでしょうか?
```ShaderLab
Shader "Sprites/Default_Custom"
{
   Properties
   {
       [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
       _Color ("Tint", Color) = (1,1,1,1)
       [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
   }
   SubShader
   {
       Tags
       {
           "Queue"="Transparent"
           "IgnoreProjector"="True"
           "RenderType"="Transparent"
           "PreviewType"="Plane"
           "CanUseSpriteAtlas"="True"
       }
       Cull Off
       Lighting Off
       ZWrite Off
       Blend One OneMinusSrcAlpha
       Pass
       {
       CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #pragma target 2.0
           #pragma multi_compile _ PIXELSNAP_ON
           #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
             
           // 追加  
           #pragma multi_compile __ UNITY_UI_CLIP_RECT  
             
           #include "UnityCG.cginc"  
           // 追加
           #include "UnityUI.cginc"
           // 追加
           #pragma multi_compile __ UNITY_UI_CLIP_RECT
           #include "UnityCG.cginc"
           // 追加
           #include "UnityUI.cginc"
           struct appdata_t
           {
               float4 vertex  : POSITION;
               float4 color   : COLOR;
               float2 texcoord : TEXCOORD0;
           };
           struct v2f
           {
               float4 vertex  : SV_POSITION;
               fixed4 color   : COLOR;
               float2 texcoord : TEXCOORD0;
               float4 worldPosition : TEXCOORD1; // 追加
               float4 worldPosition : TEXCOORD1; // 追加
           };
           fixed4 _Color;
           v2f vert(appdata_t IN)
           {
               v2f OUT;
               OUT.vertex = UnityObjectToClipPos(IN.vertex);
               OUT.texcoord = IN.texcoord;
               OUT.worldPosition = IN.vertex; // 追加
               OUT.worldPosition = IN.vertex; // 追加
               OUT.color = IN.color * _Color;
               #ifdef PIXELSNAP_ON
               OUT.vertex = UnityPixelSnap (OUT.vertex);
               #endif
               return OUT;
           }
           sampler2D _MainTex;
           sampler2D _AlphaTex;
           float4 _ClipRect; // 追加  
           fixed4 SampleSpriteTexture (float2 uv)
           {
               fixed4 color = tex2D (_MainTex, uv);
#if ETC1_EXTERNAL_ALPHA
               // get the color from an external texture (usecase: Alpha support for ETC1 on android)
               color.a = tex2D (_AlphaTex, uv).r;
#endif //ETC1_EXTERNAL_ALPHA
// 追加  
#ifdef UNITY_UI_CLIP_RECT  
               color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);  
               clip (color.a - 0.001);  
#endif //UNITY_UI_CLIP_RECT  
                 
               return color;
           }
           fixed4 frag(v2f IN) : SV_Target
           {
               fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
                 
// 追加  
#ifdef UNITY_UI_CLIP_RECT  
               c.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);  
               clip (c.a - 0.001);  
#endif //UNITY_UI_CLIP_RECT  
 
               c.rgb = c.rgb*2+max(fixed3(0,0,0),IN.color.rgb-0.5)*2;
               c.rgb *= c.a;
               return c;
           }
       ENDCG
       }
   }
}
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る