【Shader】增加Pass实现模型轮廓外发光效果

 

原有shader不变,额外增加一个pass通道用于渲染外发光

//原Pass不变,增加第二个Pass,用于显示模型外发光

Shader "Test/Model_Outlight"
{	
	Properties
	{
		_MainTex ("Diffuse (RGB)", 2D) = "grey" {}
		_Color("Color (RGBA)", Color) = (1,1,1,1)

        [MaterialToggle(_Gradual_ON)] _Toggle("Enable Gradual", Float) = 0 
        _OutlightColor("OutLightColor", Color) = (1,1,1,1)    //光晕颜色
        _OutlightSize("OutLightSize", Float) = 0.03 //光晕范围
        _OutlightFalloff("OutlightFalloff",Float) = 1 //光晕平方参数
        _OutlightTransparency("_OutlightTransparency", Float) = 10 //光晕强度
	}
	
	SubShader
	{
		Tags
        {
            "RenderType"="Opaque"
            "Queue"="AlphaTest+1"
            "IgnoreProjector"="True"
        }

		LOD 200
		Fog { Mode Off }

		Pass
		{
            CGPROGRAM

            //定义顶点/片元着色器代码
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            sampler2D _MainTex;     

            //定义顶点着色器的输入
            struct a2v
            {
                float4 vertex : POSITION;
                float2 uv :TEXCOORD0;
            };
            //定义顶点着色器的输出、片元着色器的输入
            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv:TEXCOORD0;
            };

            v2f vert (a2v v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }   
            fixed4 frag (v2f i) : SV_Target
            {
                return tex2D(_MainTex,i.uv);
            }
            ENDCG

		}

        //通道2: 用于生成模型外部的光晕
        Pass
        {
            Name "AtmosphereBase"
            Tags{ "LightMode" = "Always" }
            Cull Front
            Blend SrcAlpha One

            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #pragma multi_compile _Gradual_OFF _Gradual_ON

            #include "UnityCG.cginc"

            uniform float4 _OutlightColor;
            uniform float _OutlightSize;
            uniform float _OutlightFalloff;
            uniform float _OutlightTransparency;

            struct vertexOutput
            {
                float4 pos:SV_POSITION;
                float3 normal:TEXCOORD0;
                float3 worldvertpos:TEXCOORD1;
            };

            vertexOutput vert(appdata_base v)
            {
                vertexOutput o;
                //顶点位置以法线方向向外延伸
                v.vertex.xyz += v.normal*_OutlightSize;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.normal = v.normal;
                o.worldvertpos = mul(unity_ObjectToWorld, v.vertex);
                return o;
            }

            float4 frag(vertexOutput i):COLOR
            {
                i.normal = normalize(i.normal);
                //视角法线
                float3 viewdir = normalize(i.worldvertpos.xyz - _WorldSpaceCameraPos.xyz);
                float4 color = _OutlightColor;
#if _Gradual_ON
                //视角法线与模型法线点积形成中间指为1向四周逐渐衰减为0的点积值,赋给透明通道,形成光晕效果
                color.a = pow(saturate(dot(viewdir, i.normal)), _OutlightFalloff);
                color.a *= _OutlightTransparency*dot(viewdir, i.normal);
#endif
                return color;
            }

            ENDCG
        }

	}
	FallBack "Specular"
}

猜你喜欢

转载自blog.csdn.net/qq_39108767/article/details/123409575