贴图九宫缩放

作者:追风剑情 发布于:2023-4-13 17:43 分类:Unity3d

1、创建九宫缩放Shader

  1. //用于Quad Mesh贴图 九宫缩放
  2. Shader "Unlit/Transparent (9Palace Zoom)" {
  3. Properties {
  4. [NoScaleOffset]
  5. _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
  6. //左边距
  7. _L("Border L", Range(0, 0.5)) = 0.2
  8. //右边距
  9. _R("Border R", Range(0, 0.5)) = 0.2
  10. //上边距
  11. _T("Border T", Range(0, 0.5)) = 0.2
  12. //下边距
  13. _B("Border B", Range(0, 0.5)) = 0.2
  14. //针对四个角的缩放值
  15. _ScaleX("Scale X", Float) = 1
  16. _ScaleY("Scale Y", Float) = 1
  17. }
  18.  
  19. SubShader {
  20. Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
  21. LOD 100
  22.  
  23. ZWrite Off
  24. Blend SrcAlpha OneMinusSrcAlpha
  25.  
  26. Pass {
  27. CGPROGRAM
  28. #pragma vertex vert
  29. #pragma fragment frag
  30. #pragma target 2.0
  31. #pragma multi_compile_fog
  32.  
  33. #include "UnityCG.cginc"
  34.  
  35. struct appdata_t {
  36. float4 vertex : POSITION;
  37. float2 texcoord : TEXCOORD0;
  38. UNITY_VERTEX_INPUT_INSTANCE_ID
  39. };
  40.  
  41. struct v2f {
  42. float4 vertex : SV_POSITION;
  43. float2 texcoord : TEXCOORD0;
  44. UNITY_FOG_COORDS(1)
  45. UNITY_VERTEX_OUTPUT_STEREO
  46. };
  47.  
  48. sampler2D _MainTex;
  49. float4 _MainTex_ST;
  50. fixed _L;
  51. fixed _R;
  52. fixed _T;
  53. fixed _B;
  54. fixed _ScaleX;
  55. fixed _ScaleY;
  56.  
  57. v2f vert (appdata_t v)
  58. {
  59. v2f o;
  60. UNITY_SETUP_INSTANCE_ID(v);
  61. UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
  62. o.vertex = UnityObjectToClipPos(v.vertex);
  63. o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
  64. UNITY_TRANSFER_FOG(o,o.vertex);
  65. return o;
  66. }
  67.  
  68. fixed4 frag (v2f i) : SV_Target
  69. {
  70. fixed2 uv = i.texcoord;
  71.  
  72. //将原来的Border尺寸进行缩放
  73. fixed _sL = _L * _ScaleX;
  74. fixed _sR = _R * _ScaleX;
  75. fixed _sT = _T * _ScaleY;
  76. fixed _sB = _B * _ScaleY;
  77.  
  78. //通过插值算法将四个角的画面进行缩放
  79. //插值比例
  80. fixed _wL = uv.x / _sL;
  81. fixed _wR = (uv.x - (1 - _sR)) / _sR;
  82. fixed _wT = uv.y / _sT;
  83. fixed _wB = (uv.y - (1 - _sB)) / _sB;
  84.  
  85. //对x坐标插值
  86. /* 普通算法
  87. if (uv.x < _sL) // step(uv.x, _sL);
  88. uv.x = lerp(0, _L, _wL);
  89. else if (uv.x > 1 - _sR) //step(1-_sR, uv.x)
  90. uv.x = lerp(1 - _R, 1, _wR);
  91. else
  92. uv.x = 0.5; //step(_sL, uv.x) * step(uv.x, 1-_sR);
  93. */
  94. //优化算法
  95. uv.x = lerp(0, _L, _wL) * step(uv.x, _sL) +
  96. lerp(1 - _R, 1, _wR) * step(1 - _sR, uv.x) +
  97. 0.5 * step(_sL, uv.x) * step(uv.x, 1 - _sR);
  98.  
  99. //对y坐标插值
  100. /* 普通算法
  101. if (uv.y < _sT)
  102. uv.y = lerp(0, _T, _wT);
  103. else if (uv.y > 1 - _sT)
  104. uv.y = lerp(1 - _B, 1, _wB);
  105. else
  106. uv.y = 0.5;
  107. */
  108. //优化算法
  109. uv.y = lerp(0, _T, _wT) * step(uv.y, _sT) +
  110. lerp(1 - _B, 1, _wB) * step(1 - _sB, uv.y) +
  111. 0.5 * step(_sT, uv.y) * step(uv.y, 1 - _sB);
  112. //End
  113.  
  114. fixed4 col = tex2D(_MainTex, uv);
  115. UNITY_APPLY_FOG(i.fogCoord, col);
  116. return col;
  117. }
  118. ENDCG
  119. }
  120. }
  121. }

2、创建九宫缩放脚本(非必须)

  1. using UnityEngine;
  2. [ExecuteInEditMode]
  3. public class Transparent9PalaceZoom : MonoBehaviour
  4. {
  5. [SerializeField]
  6. private MeshRenderer meshRenderer;
  7. [SerializeField]
  8. private Texture2D mainTexture;
  9. [SerializeField]
  10. private float borderL = 0.2f;
  11. [SerializeField]
  12. private float borderR = 0.2f;
  13. [SerializeField]
  14. private float borderT = 0.2f;
  15. [SerializeField]
  16. private float borderB = 0.2f;
  17. [SerializeField]
  18. private float scaleX = 1;
  19. [SerializeField]
  20. private float scaleY = 1;
  21. [SerializeField]
  22. private bool m_Update = false;
  23.  
  24. private void Update()
  25. {
  26. if (!m_Update) return;
  27. m_Update = false;
  28.  
  29. //更新材质属性值
  30. if (meshRenderer == null)
  31. meshRenderer = this.GetComponent<MeshRenderer>();
  32. if (meshRenderer == null) return;
  33. MaterialPropertyBlock properties = new MaterialPropertyBlock();
  34. if (mainTexture != null)
  35. properties.SetTexture("_MainTex", mainTexture);
  36. properties.SetFloat("_L", borderL);
  37. properties.SetFloat("_R", borderR);
  38. properties.SetFloat("_T", borderT);
  39. properties.SetFloat("_B", borderB);
  40. properties.SetFloat("_ScaleX", scaleX);
  41. properties.SetFloat("_ScaleY", scaleY);
  42. meshRenderer.SetPropertyBlock(properties);
  43. }
  44. }

3、创建九宫缩放Material

11111.png

4、创建3个Quad

22222.png

给每个Quad设置不同的九宫缩放参数

4444.png

显示效果

33333.png

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号