UnityShader学习8 边缘泛光

// 思路:通过多pass通道来分开做效果,一个通道做泛光,一个通道做透明渐变

Shader "ShaderLearn/my_test_01" {
    Properties{
        _AttenBorder("AttenBorder", float) = 1
        _OutScale("OutScale", range(0, 1)) = 1
        
    }
    SubShader{
        tags{"queue" = "transparent"  "LightMode" = "ForwardBase"}
        
    //===============================================================
        pass
        {
            Blend SrcAlpha OneMinusSrcAlpha
            zwrite off

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f
            {
                float4 pos : POSITION;
                fixed4 col : COLOR;
                float3 normal : TEXCOORD0;//法线
                float4 vertex : TEXCOORD1;//顶点

            };

            fixed4 _Color;
            float _OutScale;
            float _AttenBorder;
            
            v2f vert(appdata_base v)
            {
                v2f o;
                v.vertex.xyz += v.normal * _OutScale* 0.1;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.col = _Color;
                o.vertex = v.vertex;
                o.normal = v.normal;

                return o;
            }

            fixed4 frag(v2f IN) : COLOR
            {

                float3 N = normalize(mul(IN.normal, unity_WorldToObject));//转换到世界空间 法向量
                float3 wpos = mul(unity_ObjectToWorld, IN.vertex);//变换到世界空间的顶点坐标
                float3 V = normalize(_WorldSpaceCameraPos - wpos);//视向量 顶点到摄像机
                
                //BorderColor
                float borderRate = saturate(dot(V, N));
                borderRate = pow(borderRate, _AttenBorder);


                return fixed4(1, 1, 1, 1) * borderRate;
            }


            ENDCG
        }

    //=========================================================
    pass
        {
            blendop revsub
            Blend dstalpha one
            zwrite off

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            struct v2f
            {
                float4 pos : POSITION;
                fixed4 col : COLOR;
                float3 normal : TEXCOORD0;//法线
                float4 vertex : TEXCOORD1;//顶点
            };

            fixed4 _Color;
            float _OutScale;
            float _AttenBorder;

            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.col = _Color;
                o.vertex = v.vertex;
                o.normal = v.normal;

                return o;
            }

            fixed4 frag(v2f IN) : COLOR
            {
                IN.col = UNITY_LIGHTMODEL_AMBIENT;

                float3 N = normalize(mul(IN.normal, unity_WorldToObject));//转换到世界空间 法向量
                float3 wpos = mul(unity_ObjectToWorld, IN.vertex);//变换到世界空间的顶点坐标
                float3 V = normalize(_WorldSpaceCameraPos - wpos);//视向量 顶点到摄像机


                //BorderColor
                float borderRate = saturate(dot(V, N));
                borderRate = pow(borderRate, _AttenBorder);


                return fixed4(1, 1, 1, 1) * borderRate;
            }
            ENDCG
        }

    //===================================================
        pass
        {
            //Blend  zero one
            Blend SrcAlpha OneMinusSrcAlpha
            zwrite off

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            struct v2f
            {
                float4 pos : POSITION;
                fixed4 col : COLOR;
                float3 normal : TEXCOORD0;//法线
                float4 vertex : TEXCOORD1;//顶点
            };

            fixed4 _Color;
            float _OutScale;
            float _AttenBorder;

            v2f vert(appdata_base v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.col = _Color;
                o.vertex = v.vertex;
                o.normal = v.normal;

                return o;
            }

            fixed4 frag(v2f IN) : COLOR
            {
                IN.col = UNITY_LIGHTMODEL_AMBIENT;

                float3 N = normalize(mul(IN.normal, unity_WorldToObject));//转换到世界空间 法向量
                float3 wpos = mul(unity_ObjectToWorld, IN.vertex);//变换到世界空间的顶点坐标
                float3 V = normalize(_WorldSpaceCameraPos - wpos);//视向量 顶点到摄像机
                

                //BorderColor
                float borderRate = 1 - saturate(dot(V, N));
                borderRate = pow(borderRate, _AttenBorder);
                

                return fixed4(1, 1, 1, 1) * borderRate;
            }

            ENDCG
        }
        
    }
    FallBack "Diffuse"
}

 

posted on 2019-06-09 10:14  炼金师  阅读(785)  评论(0)    收藏  举报

导航