Unity SpriteRender 支持Tile平铺的Shader

发表于2018-03-06
评论0 3.5k浏览
默认的SpriteRender不支持平铺,因此需要重复平铺地砖的时候,要么就得用一个Quad,要么就得重复的铺多个SpriteRender。

使用Quad的情况下,还需要处理Z轴,比较麻烦,要不就会出现Z-Fighting(个别小米手机上会出现)

而使用平铺很多SpriteRanderer的方法,又会引起效能损耗。于是想通过修改Unity内置的Shader的方式,让SpriteRender支持平铺,下面就给大家介绍这个支持Tile平铺的Shader。

效果如下:

设置如下:

Shader如下:
Shader "Sprite/SupportTiling"  
{  
    Properties  
    {  
        [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}  
        _Color("Tint", Color) = (1, 1, 1, 1)  
        _RepeatX("RepeatX", float) = 1  
        _RepeatY("RepeatY", float) = 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  
#include "UnityCG.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;  
            };  
            fixed4 _Color;  
            v2f vert(appdata_t IN)  
            {  
                v2f OUT;  
                OUT.vertex = UnityObjectToClipPos(IN.vertex);  
                OUT.texcoord = IN.texcoord;  
                OUT.color = IN.color * _Color;  
#ifdef PIXELSNAP_ON  
                OUT.vertex = UnityPixelSnap(OUT.vertex);  
#endif  
                return OUT;  
            }  
            sampler2D _MainTex;  
            sampler2D _AlphaTex;  
            fixed _RepeatX;  
            fixed _RepeatY;  
            fixed4 SampleSpriteTexture(float2 uv)  
            {  
                uv.x = (uv.x - (int)(uv.x / (1 / _RepeatX)) * (1 / _RepeatX)) * _RepeatX;  
                uv.y = (uv.y - (int)(uv.y / (1 / _RepeatY)) * (1 / _RepeatY)) * _RepeatY;  
                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  
                return color;  
            }  
            fixed4 frag(v2f IN) : SV_Target  
            {  
                fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;  
                c.rgb *= c.a;  
                return c;  
            }  
            ENDCG  
        }  
    }  
}  

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引