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

122 lines
3.0 KiB
Plaintext
Raw Permalink 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/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"
}