Outline on Sprite Mask when switching from Discard to Alpha
I am using the following shaders to mask two sprites:
 Shader "Sprites/Stencil Mask"
 {
     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
         Fog { Mode Off }
         Blend SrcAlpha OneMinusSrcAlpha
  
         Pass
         {
             Stencil
             {
                 Ref 1
                 Comp always
                 Pass replace
             }
      
         CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             #pragma multi_compile DUMMY PIXELSNAP_ON
             #include "UnityCG.cginc"
      
             struct appdata_t
             {
                 float4 vertex   : POSITION;
                 float4 color    : COLOR;
                 float2 texcoord : 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.texcoord;
                 OUT.color = IN.color * _Color;
                 #ifdef PIXELSNAP_ON
                 OUT.vertex = UnityPixelSnap (OUT.vertex);
                 #endif
  
                 return OUT;
             }
  
             sampler2D _MainTex;
  
             fixed4 frag(v2f IN) : SV_Target
             {
                 fixed4 c = tex2D(_MainTex, IN.texcoord) * IN.color;
                 if (c.a<0.1) discard;            //Most IMPORTANT working Code
                 c.rgb *= c.a;
                 return c;
             }
         ENDCG
         }
     }
 }
  
 Shader "Sprites/Stencil Draw In Mask"
 {
     Properties
     {
         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
         _Color ("Tint", Color) = (1,1,1,1)
         [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
     }
  
     SubShader
     {
         Tags
         {
             "Queue"="Transparent+1"              //DON'T FORGET this must be drew later to catch Stencil Ref value.
             "IgnoreProjector"="True"
             "RenderType"="Transparent"
             "PreviewType"="Plane"
             "CanUseSpriteAtlas"="True"
         }
  
         Cull Off
         Lighting Off
         ZWrite Off
         Fog { Mode Off }
         Blend One One
  
         Pass
         {
             Stencil
             {
                 Ref 1
                 Comp Equal
             }
  
         CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             #pragma multi_compile DUMMY PIXELSNAP_ON
             #include "UnityCG.cginc"
      
             struct appdata_t
             {
                 float4 vertex   : POSITION;
                 float4 color    : COLOR;
                 float2 texcoord : 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.texcoord;
                 OUT.color = IN.color * _Color;
                 #ifdef PIXELSNAP_ON
                 OUT.vertex = UnityPixelSnap (OUT.vertex);
                 #endif
  
                 return OUT;
             }
  
             sampler2D _MainTex;
  
             fixed4 frag(v2f IN) : SV_Target
             {
                 fixed4 c = tex2D(_MainTex, IN.texcoord) * IN.color;
                 c.rgb *= c.a;
                 return c;
             }
         ENDCG
         }
     }
 }
 
               This worked fine on my iPhone 6S but not on older devices like my iPhone 5 running iOS 7. I read that this was because of the Discard statement and that I should instead set the alpha to zero. I did this, but then I get an outline around my object. I have tried to disable anti aliasing to troubleshoot, but that did not work. My new shader (only changed that one line from discard to c.a = 0)
 Shader "Sprites/Stencil Mask"
 {
     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
         Fog { Mode Off }
         Blend SrcAlpha OneMinusSrcAlpha
  
         Pass
         {
             Stencil
             {
                 Ref 1
                 Comp always
                 Pass replace
             }
      
         CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             #pragma multi_compile DUMMY PIXELSNAP_ON
             #include "UnityCG.cginc"
      
             struct appdata_t
             {
                 float4 vertex   : POSITION;
                 float4 color    : COLOR;
                 float2 texcoord : 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.texcoord;
                 OUT.color = IN.color * _Color;
                 #ifdef PIXELSNAP_ON
                 OUT.vertex = UnityPixelSnap (OUT.vertex);
                 #endif
  
                 return OUT;
             }
  
             sampler2D _MainTex;
  
             fixed4 frag(v2f IN) : SV_Target
             {
                 fixed4 c = tex2D(_MainTex, IN.texcoord) * IN.color;
                 if (c.a<0.1) c.a = 0;            //Most IMPORTANT working Code
                 c.rgb *= c.a;
                 return c;
             }
         ENDCG
         }
     }
 }
  
 
               results before (with discard): 
results after (with c.a=0): 
How can I get a clean sprite mask without using discard? Thank you :)
Answer by sora_jp · Mar 03, 2017 at 01:52 PM
I dont know a lot about shaders. But maybe se c.a to null? If there even is a null value
I had not thought of that (good thinking). Unfortunately, it does not work :( Setting it to c.a = NULL; 
I also get a Shader Error: cannot convert from 'const null' to 'half' at line 76 (on glcore)
Hmm... then maybe experiment with different values, like -1
I honestly don't know a lot about shaders, but I'm trying my best
Try using clip(-1) ins$$anonymous$$d of discard. That will also discard the pixel... Probably 
That works on my iPhone 5 now, but no longer works on my Android :(
Your answer
 
             Follow this Question
Related Questions
Shader Help : Add emission to my shader. 2 Answers
Getting Color Generated from Shader to Script to Shader 0 Answers
What is the difference between Semantic POSITION and SV_POSITION both 0 Answers
How to add a MeshCollider to a plane that has been modified with a shader displacement map 1 Answer
_Time in Image Effects 0 Answers