ModelLocalBlend.shader 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. Shader "Custom/ModelLocalBlend"
  2. {
  3. Properties
  4. {
  5. _MainTexA("Texture A", 2D) = "white" {}
  6. _MainTexB("Texture B", 2D) = "white" {}
  7. _BlendAxis("Blend Axis (X=1,Y=1,Z=1)", Vector) = (1, 0, 0, 0)
  8. _BlendCenter("Blend Center", Float) = 0.0
  9. _BlendWidth("Blend Width", Float) = 1.0
  10. }
  11. SubShader
  12. {
  13. Tags { "RenderType" = "Opaque" }
  14. Pass
  15. {
  16. CGPROGRAM
  17. #pragma vertex vert
  18. #pragma fragment frag
  19. #include "UnityCG.cginc"
  20. sampler2D _MainTexA;
  21. sampler2D _MainTexB;
  22. float4 _MainTexA_ST;
  23. float4 _MainTexB_ST;
  24. float4 _BlendAxis; // 模型空间融合方向
  25. float _BlendCenter; // 融合中心(模型局部坐标)
  26. float _BlendWidth;
  27. struct appdata
  28. {
  29. float4 vertex : POSITION;
  30. float2 uv : TEXCOORD0;
  31. };
  32. struct v2f
  33. {
  34. float4 vertex : SV_POSITION;
  35. float2 uvA : TEXCOORD0;
  36. float2 uvB : TEXCOORD1;
  37. float3 localPos : TEXCOORD2;
  38. };
  39. v2f vert(appdata v)
  40. {
  41. v2f o;
  42. o.vertex = UnityObjectToClipPos(v.vertex);
  43. o.uvA = TRANSFORM_TEX(v.uv, _MainTexA);
  44. o.uvB = TRANSFORM_TEX(v.uv, _MainTexB);
  45. o.localPos = v.vertex.xyz; // 模型局部坐标
  46. return o;
  47. }
  48. fixed4 frag(v2f i) : SV_Target
  49. {
  50. float proj = dot(i.localPos, normalize(_BlendAxis.xyz));
  51. float start = _BlendCenter - _BlendWidth * 0.5;
  52. float blendFactor = saturate((proj - start) / _BlendWidth);
  53. fixed4 colA = tex2D(_MainTexA, i.uvA);
  54. fixed4 colB = tex2D(_MainTexB, i.uvB);
  55. return lerp(colA, colB, blendFactor);
  56. }
  57. ENDCG
  58. }
  59. }
  60. }