// 地面裂纹 Shader // 挂在平躺的 Quad 上:裂纹贴图 + 径向扩散 + 颜色染色 + 整体淡出 Shader "Custom/GroundCrack" { Properties { _CrackTex ("裂纹贴图 (A=裂纹)", 2D) = "white" {} _CrackColor ("裂纹颜色", Color) = (0, 0, 0, 1) // 默认黑色 _GlowColor ("裂纹发光色 (A=强度)", Color) = (1, 0.3, 0, 0) // 默认不发光 _Progress ("扩散进度 (0~1)", Range(0, 1)) = 0 _Opacity ("整体透明度 (0~1)", Range(0, 1)) = 1 _RevealSoft ("扩散边缘柔化", Range(0.01, 0.3)) = 0.1 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent+1" "IgnoreProjector"="True" } LOD 100 ZWrite Off Cull Off Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; float2 uv : TEXCOORD0; }; sampler2D _CrackTex; float4 _CrackTex_ST; float4 _CrackColor; float4 _GlowColor; float _Progress; float _Opacity; float _RevealSoft; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _CrackTex); return o; } fixed4 frag (v2f i) : SV_Target { // 以 UV 中心为圆心,归一化距离(中心0,边缘约1) float2 p = i.uv - 0.5; float dist = length(p) * 2.0; // 径向扩散:进度越大,可见范围越远 float reveal = 1.0 - smoothstep(_Progress - _RevealSoft, _Progress, dist); // 裂纹形状(取贴图 Alpha) float crack = tex2D(_CrackTex, i.uv).a; float alpha = crack * reveal * _Opacity * _CrackColor.a; float3 col = _CrackColor.rgb; // 发光叠加(熔岩红/暗影紫等,A=0时不发光) col += _GlowColor.rgb * _GlowColor.a * crack * reveal; return float4(col, alpha); } ENDCG } } }