| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- Shader "Unlit/RoundConorNew"
- {
- Properties
- {
- [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
- _StencilComp("Stencil Comparison", Float) = 8
- _Stencil("Stencil ID", Float) = 0
- _StencilOp("Stencil Operation", Float) = 0
- _StencilWriteMask("Stencil Write Mask", Float) = 255
- _StencilReadMask("Stencil Read Mask", Float) = 255
- _ColorMask("Color Mask", Float) = 15
- _RoundedRadius("Rounded Radius", Range(0, 256)) = 64
- _Width("View Width", Float) = 200
- _Height("View Height", Float) = 200
- _BorderWidth("Border Width", Float) = 1
- _BorderColor("Boader Color", Color) = (1, 0, 0, 1)
- }
- SubShader
- {
- Tags
- {
- "Queue" = "Transparent"
- "IgnoreProjector" = "True"
- "RenderType" = "Transparent"
- "PreviewType" = "Plane"
- "CanUseSpriteAtlas" = "True"
- }
- Stencil
- {
- Ref[_Stencil]
- Comp[_StencilComp]
- Pass[_StencilOp]
- ReadMask[_StencilReadMask]
- WriteMask[_StencilWriteMask]
- }
- Cull Off
- Lighting Off
- ZWrite Off
- ZTest[unity_GUIZTestMode]
- Blend SrcAlpha OneMinusSrcAlpha
- ColorMask[_ColorMask]
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
- struct appdata_t
- {
- float4 vertex :
- POSITION;
- float4 color :
- COLOR;
- float2 texcoord :
- TEXCOORD0;
- };
- struct v2f
- {
- float4 vertex :
- SV_POSITION;
- fixed4 color :
- COLOR;
- half2 texcoord :
- TEXCOORD0;
- float4 worldPosition :
- TEXCOORD1;
- };
- fixed4 _TextureSampleAdd;
- float4 _ClipRect;
- float _RoundedRadius;
- float _Width;
- float _Height;
- float _BorderWidth;
- float4 _BorderColor;
- float4 _MainTex_TexelSize;//纹理的大小,可能没有纹理,只有顶点颜色
- v2f vert(appdata_t IN)
- {
- v2f OUT;
- OUT.worldPosition = IN.vertex;
- OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
- OUT.texcoord = IN.texcoord;
- OUT.color = IN.color;
- return OUT;
- }
- sampler2D _MainTex;
- fixed4 frag(v2f IN) : SV_Target
- {
- half4 color = IN.color;
- if (_MainTex_TexelSize.z > 0) {
- //有纹理,则颜色从纹理读取, 并叠加顶点颜色
- color = (tex2D(_MainTex, IN.texcoord)) * IN.color;
- }
- //float width = _MainTex_TexelSize.z;
- //float height = _MainTex_TexelSize.w;
- float width = _Width;
- float height = _Height;
- if (width <= 0 && _MainTex_TexelSize.z > 0)
- {
- //如果没定义宽度,而纹理又定义了宽度,则从纹理宽度读取
- width = _MainTex_TexelSize.z;
- }
- if (height <= 0 && _MainTex_TexelSize.w > 0)
- {
- //同上
- height = _MainTex_TexelSize.w;
- }
- float border_width = _BorderWidth;
- half4 border_color = _BorderColor;
- float x = IN.texcoord.x * width;
- float y = IN.texcoord.y * height;
- float r = _RoundedRadius;
- float arc_size = 0;
- //左下角
- if (x < r && y < r)
- {
- arc_size = (x - r) * (x - r) + (y - r) * (y - r);
- if (arc_size > r * r) {
- color.a = 0;
- }
- else if (border_width > 0 && arc_size > (r - border_width) * (r - border_width)) {
- color = border_color;
- }
- }
- //左上角
- if (x < r && y >(height - r))
- {
- arc_size = (x - r) * (x - r) + (y - (height - r)) * (y - (height - r));
- if (arc_size > r * r) {
- color.a = 0;
- }
- else if (border_width > 0 && arc_size > (r - border_width) * (r - border_width)) {
- color = border_color;
- }
- }
- //右下角
- if (x > (width - r) && y < r)
- {
- arc_size = (x - (width - r)) * (x - (width - r)) + (y - r) * (y - r);
- if (arc_size > r * r) {
- color.a = 0;
- }
- else if (border_width > 0 && arc_size > (r - border_width) * (r - border_width)) {
- color = border_color;
- }
- }
- //右上角
- if (x > (width - r) && y > (height - r))
- {
- arc_size = (x - (width - r)) * (x - (width - r)) + (y - (height - r)) * (y - (height - r));
- if (arc_size > r * r) {
- color.a = 0;
- }
- else if (border_width > 0 && arc_size > (r - border_width) * (r - border_width)) {
- color = border_color;
- }
- }
- if (border_width > 0) {
- //下边直线区域
- if (x > r && x < (width - r) && y < border_width) {
- color = border_color;
- }
- //上边直线区域
- if (x > r && x < (width - r) && (height - y) < border_width) {
- color = border_color;
- }
- //左边直线区域
- if (y > r && y < (height - r) && x < border_width) {
- color = border_color;
- }
- //右边直线区域
- if (y > r && y < (height - r) && x >(width - border_width)) {
- color = border_color;
- }
- }
- return color;
- }
- ENDCG
- }
- }
- }
|