Shader "Custom/ModelLocalBlend" { Properties { _MainTexA("Texture A", 2D) = "white" {} _MainTexB("Texture B", 2D) = "white" {} _BlendAxis("Blend Axis (X=1,Y=1,Z=1)", Vector) = (1, 0, 0, 0) _BlendCenter("Blend Center", Float) = 0.0 _BlendWidth("Blend Width", Float) = 1.0 } SubShader { Tags { "RenderType" = "Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTexA; sampler2D _MainTexB; float4 _MainTexA_ST; float4 _MainTexB_ST; float4 _BlendAxis; // 模型空间融合方向 float _BlendCenter; // 融合中心(模型局部坐标) float _BlendWidth; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; float2 uvA : TEXCOORD0; float2 uvB : TEXCOORD1; float3 localPos : TEXCOORD2; }; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uvA = TRANSFORM_TEX(v.uv, _MainTexA); o.uvB = TRANSFORM_TEX(v.uv, _MainTexB); o.localPos = v.vertex.xyz; // 模型局部坐标 return o; } fixed4 frag(v2f i) : SV_Target { float proj = dot(i.localPos, normalize(_BlendAxis.xyz)); float start = _BlendCenter - _BlendWidth * 0.5; float blendFactor = saturate((proj - start) / _BlendWidth); fixed4 colA = tex2D(_MainTexA, i.uvA); fixed4 colB = tex2D(_MainTexB, i.uvB); return lerp(colA, colB, blendFactor); } ENDCG } } }