Shader "Characters/CharactersV6"
{
Properties
{
[MaterialToggle] _Flare ("Flare", Float ) = 0
_Flarecolor ("Flarecolor", Color) = (0.5,0.32,0.11,1)
_MainTex ("Main (RGB)", 2D) = "white" {}
_MatCap("Mat (RGB)", 2D) = "white" {}
_BlendTex ("Blend Texture", 2D) = "white" {}
_Blend ("Texture Blend", Range (0, 1)) = 0
_RimTex ("Rim (RGB)", 2D) = "white" {}
_RimColor ("RimColor (RGB)", Color) = (0.5,0.32,0.11,1)
_Cutoff ("Alpha Cutoff", Range (0,.9)) = .5
_Hue ("Hue", Float) = 0
_Saturation ("Saturation", Float) = 0
_Value ("Value", Float) = 0
}
SubShader
{
Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }
Pass //遮挡层pass
{
blend one one //相加
ztest greater //绘制那些深度小于自己的物体
zwrite off //关闭像素的深度写入深度缓存
cull off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
uniform float4 _RimColor;
uniform sampler2D _RimTex;
struct v2f
{
float4 pos : SV_POSITION; //用来标识经过顶点着色器变换之后的顶点坐标
float2 cap : TEXCOORD0; //用于从顶点程序向片段程序之间传递数据
};
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;
return o;
}
float4 frag (v2f i) : COLOR
{
float4 mc = tex2D(_RimTex, i.cap);
return _RimColor * mc * 2.0;
}
ENDCG
}
//end pass
Pass //未遮挡层pass 正常显示
{
cull off
Name "ForwardBase"
Tags
{
"IgnoreProjector"="false"
"LightMode"="ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#define UNITY_PASS_FORWARDBASE
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma exclude_renderers xbox360 ps3 flash d3d11_9x
#pragma target 3.0
uniform sampler2D _MainTex;
uniform sampler2D _BlendTex;
uniform float _Blend;
uniform float4 _MainTex_ST;
uniform float4 _BlendTex_ST;
uniform fixed _Flare;
uniform float4 _Flarecolor;
uniform sampler2D _MatCap;
uniform float _Hue;
uniform float _Saturation;
uniform float _Value;
uniform fixed _Cutoff;
float3 RGB2HSV( float3 RGB )
{
float4 k = float4(0.0, -1.0/3.0, 2.0/3.0, -1.0);
float4 p = RGB.g < RGB.b ? float4(RGB.b, RGB.g, k.w, k.z) : float4(RGB.gb, k.xy);
float4 q = RGB.r < p.x ? float4(p.x, p.y, p.w, RGB.r) : float4(RGB.r , p.yzx);
float d = q.x - min(q.w, q.y);
float e = 1.0e-10;
return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}
float3 HSV2RGB( float3 HSV )
{
float4 k = float4(1.0, 2.0/3.0, 1.0/3.0, 3.0);
float3 p = abs(frac(HSV.xxx + k.xyz) * 6.0 - k.www);
return HSV.z * lerp(k.xxx, clamp(p - k.xxx, 0.0, 1.0), HSV.y);
}
struct Input
{
float2 uv_MainTex;
};
struct VertexInput {
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 texcoord0 : TEXCOORD0;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
float4 posWorld : TEXCOORD1;
float3 normalDir : TEXCOORD2;
float4 screenPos : TEXCOORD3;
float2 cap : TEXCOORD4;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.uv0 = v.texcoord0;
o.normalDir = mul(_Object2World, float4(v.normal,0)).xyz;
o.posWorld = mul(_Object2World, v.vertex);
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.screenPos = o.pos;
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;
return o;
}
fixed4 frag(VertexOutput i) : COLOR {
#if UNITY_UV_STARTS_AT_TOP
float grabSign = -_ProjectionParams.x;
#else
float grabSign = _ProjectionParams.x;
#endif
i.normalDir = normalize(i.normalDir);
i.screenPos = float4( i.screenPos.xy / i.screenPos.w, 0, 0 );
i.screenPos.y *= _ProjectionParams.x;
float2 sceneUVs = float2(1,grabSign)*i.screenPos.xy*0.5 + 0.5;
/////// Vectors:
float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
float3 normalDirection = i.normalDir;
////// Lighting:
float4 mainTex = tex2D(_MainTex, TRANSFORM_TEX(i.uv0, _MainTex));
float4 blendTex = tex2D(_BlendTex, TRANSFORM_TEX(i.uv0, _BlendTex));
//float4 finalTexture = lerp(mainTex, blendTex, _Blend);
float4 _MainTex_var = lerp(mainTex, blendTex, _Blend);
float3 node_3262 = RGB2HSV( _MainTex_var.rgb ).rgb;
float3 node_9090 = HSV2RGB( float3(float2((_Hue+node_3262.r),(_Saturation+node_3262.g)),(_Value+node_3262.b)) );
float node_3209_if_leA = step(_Flare,node_9090);
float node_3209_if_leB = step(node_9090,_Flare);
float3 node_3205 = (node_9090+(pow(1.0-max(0,dot(i.normalDir, viewDirection)),2.0)*_Flarecolor.rgb*3.0));
float3 finalColor = lerp( (node_3209_if_leA*node_9090) + (node_3209_if_leB*node_3205) ,node_3205,node_3209_if_leA*node_3209_if_leB);
fixed4 mc = tex2D(_MatCap, i.cap);
clip(_MainTex_var.a - _Cutoff);
//return saturate (fixed4(finalColor,1) * mc * 1.6);
return fixed4(finalColor,_MainTex_var.a) * mc * 1.6;
}
ENDCG
}
//end pass
}
//end SubShader
Fallback "Diffuse"
}