2015-11-02 75 views
0

我有水和阳光在上面。我希望太阳的光线能够超过一个前方的波浪。我已经做到了,但它只能在PC上运行,而不能在Android上运行。我应该怎么做才能在Android上运行?统一精灵蒙版着色器

顶部图片-PC,自下而上的Android: top picture-PC, bottom- Android

这里是着色的水码:

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 One 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 OneMinusSrcAlpha 

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

回答

0

不肯定它为什么不适合你,但我刚刚在Android(Galaxy S5)上测试过,它工作得很好。

感谢您提供着色器代码。这是目前我遇到的唯一有效的(和免费的)Sprite Stencil着色器。