| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- 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
- }
- }
- }
|