Shader "Custom/FlowOverlay" { Properties { _BaseMap("Base Map", 2D) = "white" {} _FlowTex("Flow Texture", 2D) = "white" {} _FlowColor("Flow Color", Color) = (1,0.5,0,1) _FlowSpeed("Flow Speed", Float) = 1.0 _FlowAngle("Flow Angle", Float) = 0.0 _Tiling("Flow Tiling", Vector) = (1,1,0,0) _FlowStrength("Flow Strength", Float) = 1.0 } SubShader { Tags { "RenderType" = "Opaque" } LOD 200 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _BaseMap; sampler2D _FlowTex; float4 _FlowColor; float _FlowSpeed; float _FlowAngle; float4 _Tiling; float _FlowStrength; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float2 uvFlow : TEXCOORD1; float4 vertex : SV_POSITION; }; float2 RotateUV(float2 uv, float angleDeg, float2 pivot) { float angleRad = radians(angleDeg); float s = sin(angleRad); float c = cos(angleRad); uv -= pivot; float2 rotatedUV = float2(uv.x * c - uv.y * s, uv.x * s + uv.y * c); return rotatedUV + pivot; } v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); // 原贴图UV o.uv = v.uv; // 电流贴图UV:先缩放,再旋转 float2 uvScaled = v.uv * _Tiling.xy; float2 uvRotated = RotateUV(uvScaled, _FlowAngle, 0.5); o.uvFlow = uvRotated + float2(_Time.y * _FlowSpeed, 0); return o; } fixed4 frag(v2f i) : SV_Target { fixed4 baseCol = tex2D(_BaseMap, i.uv); fixed4 flowTex = tex2D(_FlowTex, i.uvFlow); fixed4 flowColor = flowTex * _FlowColor * _FlowStrength; fixed4 finalColor = baseCol + flowColor; return finalColor; } ENDCG } } }