边缘发光公式:最终颜色 = (漫反射系数 * 纹理颜色 * RGB颜色) + 自发光颜色
练习shader代码
Shader "Custom/MarginLight"
{
Properties
{
_EmissiveTex("emissive texture", 2D)="white"{}
_Color("blend color", Color)=(1,1,1,1)
_MainTex("main texture", 2D)="white"{}
}
SubShader
{
Pass
{
Tags
{
"RenderType" = "Transparent"
"Queue"="Transparent"
"IgnoreProjector"="true"
}
ZWrite Off
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _EmissiveTex;
sampler2D _MainTex;
float4 _Color;
struct VertexOutput
{
float4 pos:SV_POSITION;
float2 uv:Textcoord0;
float factor:Textcoord1;
};
VertexOutput vert(appdata_base v)
{
VertexOutput o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord;
float3 normalDir = normalize(mul(_Object2World, float4(v.normal.xyz, 0)).xyz);
float4 worldPos = mul(_Object2World, v.vertex);
float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - worldPos.xyz);
float val = dot(viewDir, normalDir);
normalDir *= (sign(val));
o.factor = dot(viewDir, normalDir);
return o;
}
fixed4 frag(VertexOutput i):Color
{
float4 t = _Time;
float2 mainTex_uv = i.uv + t.g *float2(0.15, 0);
float4 mainTexColor = tex2D(_MainTex, mainTex_uv);
float2 emissiveTex_uv = i.uv + t.g * float2(0.1, 0);
float4 emissiveColor = tex2D(_EmissiveTex, emissiveTex_uv);
float3 finalColor = (1-i.factor) * mainTexColor.rgb * _Color.rgb + emissiveColor.rgb;
return fixed4(finalColor, 1);
}
ENDCG
}
}
FallBack "Diffuse"
}
效果图如下