原有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"
}