// 思路:通过多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"
}