RoundConorNew.shader 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. Shader "Unlit/RoundConorNew"
  2. {
  3. Properties
  4. {
  5. [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
  6. _StencilComp("Stencil Comparison", Float) = 8
  7. _Stencil("Stencil ID", Float) = 0
  8. _StencilOp("Stencil Operation", Float) = 0
  9. _StencilWriteMask("Stencil Write Mask", Float) = 255
  10. _StencilReadMask("Stencil Read Mask", Float) = 255
  11. _ColorMask("Color Mask", Float) = 15
  12. _RoundedRadius("Rounded Radius", Range(0, 256)) = 64
  13. _Width("View Width", Float) = 200
  14. _Height("View Height", Float) = 200
  15. _BorderWidth("Border Width", Float) = 1
  16. _BorderColor("Boader Color", Color) = (1, 0, 0, 1)
  17. }
  18. SubShader
  19. {
  20. Tags
  21. {
  22. "Queue" = "Transparent"
  23. "IgnoreProjector" = "True"
  24. "RenderType" = "Transparent"
  25. "PreviewType" = "Plane"
  26. "CanUseSpriteAtlas" = "True"
  27. }
  28. Stencil
  29. {
  30. Ref[_Stencil]
  31. Comp[_StencilComp]
  32. Pass[_StencilOp]
  33. ReadMask[_StencilReadMask]
  34. WriteMask[_StencilWriteMask]
  35. }
  36. Cull Off
  37. Lighting Off
  38. ZWrite Off
  39. ZTest[unity_GUIZTestMode]
  40. Blend SrcAlpha OneMinusSrcAlpha
  41. ColorMask[_ColorMask]
  42. Pass
  43. {
  44. CGPROGRAM
  45. #pragma vertex vert
  46. #pragma fragment frag
  47. #include "UnityCG.cginc"
  48. #include "UnityUI.cginc"
  49. #pragma multi_compile __ UNITY_UI_ALPHACLIP
  50. struct appdata_t
  51. {
  52. float4 vertex :
  53. POSITION;
  54. float4 color :
  55. COLOR;
  56. float2 texcoord :
  57. TEXCOORD0;
  58. };
  59. struct v2f
  60. {
  61. float4 vertex :
  62. SV_POSITION;
  63. fixed4 color :
  64. COLOR;
  65. half2 texcoord :
  66. TEXCOORD0;
  67. float4 worldPosition :
  68. TEXCOORD1;
  69. };
  70. fixed4 _TextureSampleAdd;
  71. float4 _ClipRect;
  72. float _RoundedRadius;
  73. float _Width;
  74. float _Height;
  75. float _BorderWidth;
  76. float4 _BorderColor;
  77. float4 _MainTex_TexelSize;//纹理的大小,可能没有纹理,只有顶点颜色
  78. v2f vert(appdata_t IN)
  79. {
  80. v2f OUT;
  81. OUT.worldPosition = IN.vertex;
  82. OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
  83. OUT.texcoord = IN.texcoord;
  84. OUT.color = IN.color;
  85. return OUT;
  86. }
  87. sampler2D _MainTex;
  88. fixed4 frag(v2f IN) : SV_Target
  89. {
  90. half4 color = IN.color;
  91. if (_MainTex_TexelSize.z > 0) {
  92. //有纹理,则颜色从纹理读取, 并叠加顶点颜色
  93. color = (tex2D(_MainTex, IN.texcoord)) * IN.color;
  94. }
  95. //float width = _MainTex_TexelSize.z;
  96. //float height = _MainTex_TexelSize.w;
  97. float width = _Width;
  98. float height = _Height;
  99. if (width <= 0 && _MainTex_TexelSize.z > 0)
  100. {
  101. //如果没定义宽度,而纹理又定义了宽度,则从纹理宽度读取
  102. width = _MainTex_TexelSize.z;
  103. }
  104. if (height <= 0 && _MainTex_TexelSize.w > 0)
  105. {
  106. //同上
  107. height = _MainTex_TexelSize.w;
  108. }
  109. float border_width = _BorderWidth;
  110. half4 border_color = _BorderColor;
  111. float x = IN.texcoord.x * width;
  112. float y = IN.texcoord.y * height;
  113. float r = _RoundedRadius;
  114. float arc_size = 0;
  115. //左下角
  116. if (x < r && y < r)
  117. {
  118. arc_size = (x - r) * (x - r) + (y - r) * (y - r);
  119. if (arc_size > r * r) {
  120. color.a = 0;
  121. }
  122. else if (border_width > 0 && arc_size > (r - border_width) * (r - border_width)) {
  123. color = border_color;
  124. }
  125. }
  126. //左上角
  127. if (x < r && y >(height - r))
  128. {
  129. arc_size = (x - r) * (x - r) + (y - (height - r)) * (y - (height - r));
  130. if (arc_size > r * r) {
  131. color.a = 0;
  132. }
  133. else if (border_width > 0 && arc_size > (r - border_width) * (r - border_width)) {
  134. color = border_color;
  135. }
  136. }
  137. //右下角
  138. if (x > (width - r) && y < r)
  139. {
  140. arc_size = (x - (width - r)) * (x - (width - r)) + (y - r) * (y - r);
  141. if (arc_size > r * r) {
  142. color.a = 0;
  143. }
  144. else if (border_width > 0 && arc_size > (r - border_width) * (r - border_width)) {
  145. color = border_color;
  146. }
  147. }
  148. //右上角
  149. if (x > (width - r) && y > (height - r))
  150. {
  151. arc_size = (x - (width - r)) * (x - (width - r)) + (y - (height - r)) * (y - (height - r));
  152. if (arc_size > r * r) {
  153. color.a = 0;
  154. }
  155. else if (border_width > 0 && arc_size > (r - border_width) * (r - border_width)) {
  156. color = border_color;
  157. }
  158. }
  159. if (border_width > 0) {
  160. //下边直线区域
  161. if (x > r && x < (width - r) && y < border_width) {
  162. color = border_color;
  163. }
  164. //上边直线区域
  165. if (x > r && x < (width - r) && (height - y) < border_width) {
  166. color = border_color;
  167. }
  168. //左边直线区域
  169. if (y > r && y < (height - r) && x < border_width) {
  170. color = border_color;
  171. }
  172. //右边直线区域
  173. if (y > r && y < (height - r) && x >(width - border_width)) {
  174. color = border_color;
  175. }
  176. }
  177. return color;
  178. }
  179. ENDCG
  180. }
  181. }
  182. }