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" {} // ChannelTex,r表示漫反射亮度,g表示镜面反射亮度,b表示流光亮度 [NoScaleOffset]_ChannelTex("Channel(RGBA 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" }