Unity里面为Sprite添加边框写的的shader

来源:互联网 发布:php登录成功显示用户名 编辑:程序博客网 时间:2024/06/11 04:42

小boss让我写个shader加到sprite上,然后发现了一个神奇的问题,

Sprite的vertex在哪?现在考虑一种Sprite,它的内容没有占满整个

sprite的rect(就是你能拖动的rect),其他地方是透明的。这种sprite

的顶点既不是rect的四个顶点,也不在图像内容的边界上,而是系统

自动生成的一个多边形,这个多边形比图像内容大,把图像内容包括

在其中。

那么我现在想弄一个效果,原sprite的背后弄个影子,对于新创建的

sprite,他的shader是内置的。只能自己新建一个material,然后把做

sprite的png图像拖到material的tex里。

主要是怎么排除多边形内部的透明部分,其实就是用 Blend One One让

该部分与当前屏幕的颜色混合就行,具体看代码。另外我又发现一个问题,

可能是个偶然会出现的bug还是什么,两个自定义的shader内容完全一致(除了

文件名字和第一行的shader“XXX”),竟然有一个会得出异常结果。

Shader "Custom/Fragment extend" {
    Properties {
        _Color ("Surround Color"Color) = (0.2,0.2,0.2,0.7)
        _MainTex ("Base (RGB)"2D) = "white" {}
        _Range("Range",Range(0.1,0.3)) = 0.15
        //_Range2("Range",Range(0.1,10))=0.5
    }
    SubShader {
    //Tags{"RenderType"="Transparent"}
        //Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
        LOD 100
    Pass{
        Blend One One
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
             float _Range;
             sampler2D _MainTex;
             float _Range2;
             float4 _Color;
             struct appdata_t
            {
                float4 vertex : POSITION;
                //half4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };
            struct v2f
            {
                float4 vertex : POSITION;
                //half4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                //float2 worldPos : TEXCOORD1;
            };

            v2f vert (appdata_t v)
            {
                v2f o;
                v.vertex.xyz+=_Range*v.vertex.xyz;
                //v.vertex.xy+=_Range2;
                o.vertex = mul(UNITY_MATRIX_MVP,v.vertex);
                //o.texcoord=TRANSFORM_TEX(v.texcoord,_MainTex);
                o.texcoord=v.texcoord;
                return o;
            }

            half4 frag (v2f IN) : COLOR
            {
            half4 I=tex2D(_MainTex,IN.texcoord);
            if(I.a<0.4)
            {
             I.rgb=0f;
             I.a=0f;
            }
            else
            I.rgb*=_Color.rgb;
            return I;
            } 
            ENDCG
        }
        Pass{
        Blend One One
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
             float _Range;
             sampler2D _MainTex;
             float4 _Color;
            struct appdata_t
            {
                float4 vertex : POSITION;
                //half4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };
            struct v2f
            {
                float4 vertex : POSITION;
                //half4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                //float2 worldPos : TEXCOORD1;
            };

            v2f vert (appdata_t v)
            {
                v2f o;
                //v.vertex.xyz+=_Range*v.vertex.xyz;
                o.vertex = mul(UNITY_MATRIX_MVPv.vertex);
                //o.texcoord=TRANSFORM_TEX(v.texcoord,_MainTex);
                o.texcoord=v.texcoord;
                
                return o;
            }

            half4 frag (v2f IN) : COLOR
            {
            half4 I=tex2D(_MainTex,IN.texcoord);
            if(I.a<0.4)
            {
            // I.rgb=0;
            // I.a=0;
            I=0;
            //I.rgba=0;
            }
            return I;
            } 
            ENDCG
        }
        //Pass{
        //    Tags{"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
        //    Blend One Zero
        //    SetTexture [_MainTex]
        //    {
        //        Combine Texture
        //    }
        //}
    
    // third part
    } 
    FallBack "VertexLit"
}

0 0