Shader "CM/RimLight" {
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_IlluminPower("Illumin Power", Range(0, 2)) = 1
_RimColor ("Rim Color", Color) = (1, 1, 1, 1)
_RimPower ("Rim Power", Float) = 0.7
}
SubShader
{
Pass
{
Lighting Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform fixed4 _Color;
uniform float4 _MainTex_ST;
float _IlluminPower;
uniform fixed4 _RimColor;
float _RimPower;
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed3 color : COLOR;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
float dotProduct = 1 - dot(v.normal, viewDir);
o.color = _RimColor * pow(dotProduct, _RimPower);//smoothstep(1 - _RimPower, 1.0, dotProduct);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f i) : COLOR
{
fixed4 texcol = tex2D(_MainTex, i.uv);
texcol.rgb = texcol.rgb * _Color.rgb * _IlluminPower + i.color;
return texcol;
}
ENDCG
}
}
}
冰冻效果
二、使用cap texture:
Shader "CM/Rimlight2" {
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_IlluminPower("Illumin Power", Range(0, 2)) = 1
_CapTex("Cap Tex (RGB)", 2D) = "white" {}
_CapColor("Cap Color", Color) = (1,1,1,1)
_CapIntensity("Cap Intensity", Range(0,3)) = 0
}
SubShader
{
Pass
{
Lighting Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform fixed4 _Color;
uniform float4 _MainTex_ST;
float _IlluminPower;
float _CapIntensity;
uniform sampler2D _CapTex;
fixed4 _CapColor;
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed2 cap : COLOR;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
half2 capCoord;
capCoord.x = dot(UNITY_MATRIX_IT_MV[0].xyz,v.normal);
capCoord.y = dot(UNITY_MATRIX_IT_MV[1].xyz,v.normal);
o.cap = capCoord * 0.5 + 0.5;
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f i) : COLOR
{
fixed4 texcol = tex2D(_MainTex, i.uv);
fixed4 cap = tex2D(_CapTex, i.cap);
texcol.rgb = texcol.rgb * _Color.rgb * _IlluminPower + cap.rgb * _CapIntensity * _CapColor;
return texcol;
}
ENDCG
}
}
}
三、在光照射方向上存在边缘光
Shader "CM/Rimlight3" {
Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_IlluminPower("Illumin Power", Range(0, 2)) = 1
_RimColor ("Rim Color", Color) = (0, 0.8, 0.8, 1)
_RimPower ("Rim Power", Float) = 0.7
}
SubShader
{
Pass
{
Lighting Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform fixed4 _Color;
uniform float4 _MainTex_ST;
float _IlluminPower;
uniform fixed4 _RimColor;
float _RimPower;
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed3 color : COLOR;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
float dotRim = 1 - dot(v.normal, viewDir);
float3 lightDir = normalize(ObjSpaceLightDir(v.vertex));
float dotDiff = dot(v.normal, lightDir);
o.color = _RimColor * pow(dotRim, _RimPower) * dotDiff;
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f i) : COLOR
{
fixed4 texcol = tex2D(_MainTex, i.uv);
texcol.rgb = texcol.rgb * _Color.rgb * _IlluminPower + i.color;
return texcol;
}
ENDCG
}
}
}
四、在光照射方向上产生边缘光 ----------------- 使用matcap 贴图 (shader 依然用上面的rimlight2), 只需要替换matcap贴图 即可: