2015-11-02 6 views
0

У меня есть вода и солнечный свет на нем. Я хочу, чтобы солнечный свет был выше одной передней волны. Мне удалось это сделать, но он работает только на ПК, а не на Android. Что я должен делать, чтобы работать на Android?Unity sprite mask shader

верхняя картинка-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, с которым я столкнулся.

Смежные вопросы