Files
JJBB/Assets/Project/Shader/Player.shader

178 lines
5.4 KiB
Plaintext
Raw Normal View History

2024-08-23 15:49:34 +08:00
Shader "Zhanyou/Character/Player"
{
Properties
{
_MainTex ("Main Texture", 2D) = "white" {}
_Emission ("Emission", float) = 0
_ColorRate("Color Rate", Range(0, 1)) = 0.9
_Cutoff("Alpha Cutoff", Range(0, 1)) = 0.5
[NoScaleOffset]_BumpTex("Normal Map", 2D) = "bump" {}
// ChannelTexr表示漫反射亮度g表示镜面反射亮度b表示流光亮度
[NoScaleOffset]_ChannelTex("ChannelRGBA Specular/Color/Outline)", 2D) = "white" {}
_SpecPower ("Specular", float) = 5
_SpecGloss("Gloss", float) = 10
_OutlinePower("Outline Power", float) = 2
_OutlineColor("Outline Color", Color) = (1,1,1,1)
_UiLightDir ("Ui Light Dir", Vector) = (1, 0, 0, 0)
// 角色材质颜色,乘法运算
_Color("Blend Color", Color) = (1, 1, 1, 1)
// Emission叠加颜色加法运算
_AddColor("Additive Color", Color) = (0, 0, 0, 1)
}
SubShader
{
Tags{"Queue"="AlphaTest+10" "RenderType"="CharacterCutout" }
Pass
{
Stencil {
Ref 1
Comp always
Pass replace
}
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile __ CHARACTER_NORMAL_OFF
#pragma multi_compile __ UseSpecular
#pragma multi_compile_fog
struct appdata
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float2 texcoord : TEXCOORD0;
};
#if UseSpecular && !CHARACTER_NORMAL_OFF
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 tSpace0 : TEXCOORD1;
float4 tSpace1 : TEXCOORD2;
float4 tSpace2 : TEXCOORD3;
float3 lightDir : TEXCOORD4;
UNITY_FOG_COORDS(5)
};
uniform float _ColorRate;
uniform float _SpecPower;
uniform float _SpecGloss;
uniform float _OutlinePower;
uniform float4 _OutlineColor;
uniform float4 _UiLightDir;
#else
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
};
#endif
uniform sampler2D _MainTex;
#if UseSpecular && !CHARACTER_NORMAL_OFF
uniform sampler2D _BumpTex;
uniform sampler2D _ChannelTex;
#endif
uniform float _Cutoff;
uniform float _Emission;
uniform float4 _Color;
uniform float4 _AddColor;
v2f vert (appdata v)
{
v2f o;
UNITY_INITIALIZE_OUTPUT(v2f, o);
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
#if UseSpecular && !CHARACTER_NORMAL_OFF
float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;
fixed3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign;
o.tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
o.tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
o.tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);
o.lightDir = normalize(_UiLightDir.xyz);
float4 worldForward;
worldForward.x = -UNITY_MATRIX_IT_MV[2].x;
worldForward.y = -UNITY_MATRIX_IT_MV[2].y;
worldForward.z = -UNITY_MATRIX_IT_MV[2].z;
worldForward.w = 1;
worldForward = mul(unity_ObjectToWorld, worldForward);
float3 x = normalize(cross(float3(0, 1, 0), worldForward.xyz));
float3 z = normalize(cross(x, float3(0, 1, 0)));
o.lightDir = normalize(x * o.lightDir.x + float3(0, o.lightDir.y, 0) + z * o.lightDir.z);
#endif
UNITY_TRANSFER_FOG(o, o.pos);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
clip(col.a - _Cutoff);
col.rgb += col.rgb * _Emission;
col.rgb *= _Color.rgb;
#if UseSpecular && !CHARACTER_NORMAL_OFF
float3 worldPos = float3(i.tSpace0.w, i.tSpace1.w, i.tSpace2.w);
fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
half3 normal = UnpackNormal(tex2D(_BumpTex, i.uv));
half4 channelCol = tex2D(_ChannelTex, i.uv);
fixed3 worldNormal;
worldNormal.x = dot(i.tSpace0.xyz, normal);
worldNormal.y = dot(i.tSpace1.xyz, normal);
worldNormal.z = dot(i.tSpace2.xyz, normal);
worldNormal = normalize(worldNormal);
half3 h = normalize (i.lightDir + worldViewDir);
half nh = max (0, dot (worldNormal, h));
half specular = pow (nh, _SpecPower) * _SpecGloss;
half outline = max(0, 1 - dot(worldNormal, worldViewDir));
col.rgb = col.rgb * (_ColorRate + (1 - _ColorRate) * channelCol.g) + col.rgb * specular * channelCol.r + _OutlineColor.rgb * pow(outline, _OutlinePower) * channelCol.b;
#endif
col.rgb += _AddColor.rgb;
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
Pass
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
ZWrite On ZTest LEqual Cull Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#pragma multi_compile_shadowcaster
#include "UnityCG.cginc"
struct v2f {
V2F_SHADOW_CASTER;
};
v2f vert( appdata_base v )
{
v2f o;
TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
return o;
}
float4 frag( v2f i ) : SV_Target
{
SHADOW_CASTER_FRAGMENT(i)
}
ENDCG
}
}
CustomEditor "PlayerShaderGui"
Fallback "Zhanyou/Character/NPCAlpha"
}