JJBB/Assets/Project/Shader/Player.shader
2024-08-23 15:49:34 +08:00

178 lines
5.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"
}