// 幽灵模式渲染shader
|
|
Shader "SaberShad/GhostModeShader"
|
|
{
|
|
Properties {
|
|
_MainTex ("Main Tex", 2D) = "white" {} //主纹理
|
|
// _BumpMap("Bump Map",2D)= "bump" {} //法线纹理
|
|
_RimColor("Rim Color",Color) = (1, 1, 1, 1) //模型边缘颜色
|
|
_RimPower("Rim Power",Range(0.2,2.0)) = 1.5 //边缘强度放大的倍数
|
|
_Brightness("Brightness",Range(0.0,3.0)) = 2.0 //光强
|
|
}
|
|
SubShader {
|
|
Tags{
|
|
"RenderType"="Transparent"
|
|
"Queue"="Transparent"
|
|
"IgnoreProject"="True"
|
|
}
|
|
Pass{
|
|
ZWrite On // 写入深度缓存的作用就是为ZTest的比较做准备
|
|
ColorMask 0
|
|
}
|
|
CGPROGRAM
|
|
#pragma surface surf Lambert alpha noambient nodirlightmap novertexlights
|
|
struct Input{
|
|
float2 uv_MainTex;
|
|
float2 uv_BumpMap;
|
|
float3 viewDir;//当前视角方向
|
|
float3 worldNormal; // 使用模型自己的法线
|
|
};
|
|
sampler2D _MainTex;
|
|
sampler2D _BumpMap;
|
|
float4 _RimColor;
|
|
float _RimPower;
|
|
float _Brightness;
|
|
void surf(Input IN,inout SurfaceOutput o)
|
|
{
|
|
half4 basecol=tex2D(_MainTex,IN.uv_MainTex);
|
|
//RGB转为灰度值
|
|
half3 graycol=dot(basecol.rgb,float3(0.3,0.59,0.11));
|
|
o.Albedo=graycol;
|
|
// o.Normal=UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));
|
|
//点积即为cosA的值(其中A是viewDir和Normal的夹角),值域为1-0
|
|
//那么1-cosA的值域就变成0-1了,当A角度达到90,正好模拟边缘光的强度
|
|
// 可以理解为视线角度跟表面法线的点乘越高(角度越小),边缘光效果越差
|
|
half rim=1.0-saturate(dot(normalize(IN.viewDir),IN.worldNormal));
|
|
//把边缘光放大_RimPower倍,使边缘光更清楚
|
|
o.Emission=_RimColor*pow(rim,_RimPower)*_Brightness;
|
|
o.Alpha=(o.Emission.r+o.Emission.g+o.Emission.b) / 3.0;
|
|
}
|
|
ENDCG
|
|
}
|
|
FallBack "Diffuse"
|
|
}
|