Shader "Zhanyou/Character/NPCAlpha" {
	Properties {
		_MainTex ("Base (RGB)", 2D) = "white" {}
		_Emission ("Emission", Range(0, 1)) = 0.2
		// 角色材质颜色,乘法运算
		_Color("Blend Color", Color) = (1, 1, 1, 1)
		// Emission叠加颜色,加法运算
		_AddColor("Additive Color", Color) = (0, 0, 0, 1)
		_Outline ("Outline Power", float) = 22
		_OutlineColor ("Outline Color", Color) = (0.03, 0.03, 0.03, 1)
		_Cutoff("Alpha Cutoff", Range(0, 1)) = 0.5
		// 流光贴图
		_FlowTex ("Flow (RGB)", 2D) = "black" {}
		// 流光颜色
		_FlowColor ("Flow Color", Color) = (1, 1, 1, 1)
		// 流光速度
		_FlowSpeed ("Flow Speed", float) = 1
	}

	SubShader {
		Tags { "Queue"="AlphaTest+10" "RenderType"="CharacterCutout" }

		Pass {
		    Stencil {
                Ref 1
                Comp always
                Pass replace
            }
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma shader_feature UseFlowColor
			#pragma multi_compile_fog
			#include "NpcBase.cginc"
			
			struct v2f {
				float4 pos : SV_POSITION;
				float2 texcoord : TEXCOORD0;
				half rim : TEXCOORD1;
				UNITY_FOG_COORDS(2)
				#if UseFlowColor
					FLOW_UV(3)
				#endif
			};
	
			v2f vert (appdata_tan v)
			{
				v2f o;
				UNITY_INITIALIZE_OUTPUT(v2f, o);
				NPC_VERT_COMMON(o);
				#if UseFlowColor
					FLOW_VERT(o);
				#endif
				UNITY_TRANSFER_FOG(o, o.pos);
				return o;
			}
			
			uniform half _Cutoff;

			fixed4 frag(v2f i) : SV_TARGET
			{
				fixed4 col;
				// 可以略优化到展开贴图后立刻执行clip
				NPC_FRAG_COMMON(col);
				clip(col.a - _Cutoff);
				#if UseFlowColor
					FLOW_FRAG(col);
				#endif
				UNITY_OPAQUE_ALPHA(col.a);
				UNITY_APPLY_FOG(i.fogCoord, col);
				return col;
			}
			ENDCG
		}

		// 其实没有用的投影通道,但是Unity貌似会用这个通道做屏幕深度运算,所以保留一个
		// Shadow Caster
		// ---- shadow caster pass:
		Pass {
			Name "ShadowCaster"
			Tags { "LightMode" = "ShadowCaster" }
			
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_shadowcaster
			#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
			#include "HLSLSupport.cginc"
			#include "UnityShaderVariables.cginc"
			#define UNITY_PASS_SHADOWCASTER
			#include "UnityCG.cginc"
			#include "Lighting.cginc"
			half _Cutoff;

			sampler2D _MainTex;
			float4 _MainTex_ST;
			struct v2f {
				V2F_SHADOW_CASTER;
				float2 uv : TEXCOORD1; // _MainTex
				float3 worldPos : TEXCOORD2;
			};
			v2f vert (appdata_full v) {
				v2f o;
				UNITY_TRANSFER_INSTANCE_ID(v,o);
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
				fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
				o.worldPos = worldPos;
				TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)
				return o;
			}
			fixed4 frag (v2f i) : SV_Target {
				fixed4 c = tex2D(_MainTex, i.uv);
				clip (c.a - _Cutoff);
				SHADOW_CASTER_FRAGMENT(i)
			}
			ENDCG
		}
	}
	CustomEditor "FlowToggleShaderGui"
	Fallback "Zhanyou/Character/NPC" 
}