UGUI 圆角Shader
发表于2017-05-05
有些图片需要将直角变为圆角,有什么方法可以实现这个功能呢,这就要用到本篇文章要和大家介绍的UGUI中的圆角Shader,具体实现方法如下:
以下代码改自builtin_shaders-5.3.2f1DefaultResourcesExtraUIUI-Default.shader
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | Shader "Custom/UI/RoundedDefault"{ Properties { [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} _Color("Tint", Color) = (1,1,1,1) _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 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip("Use Alpha Clip", Float) = 0 _RoundedRadius("Rounded Radius", Range(0, 256)) = 64 } 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 _Color; fixed4 _TextureSampleAdd; float4 _ClipRect; float _RoundedRadius; float4 _MainTex_TexelSize; v2f vert(appdata_t IN) { v2f OUT; OUT.worldPosition = IN.vertex; OUT.vertex = mul(UNITY_MATRIX_MVP, OUT.worldPosition); OUT.texcoord = IN.texcoord;#ifdef UNITY_HALF_TEXEL_OFFSET OUT.vertex.xy += (_ScreenParams.zw - 1.0)*float2(-1,1);#endif OUT.color = IN.color * _Color; return OUT; } sampler2D _MainTex; fixed4 frag(v2f IN) : SV_Target { half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);#ifdef UNITY_UI_ALPHACLIP clip(color.a - 0.001);#endif float width = _MainTex_TexelSize.z; float height = _MainTex_TexelSize.w; float x = IN.texcoord.x * width; float y = IN.texcoord.y * height; float r = _RoundedRadius; //左下角 if (x < r && y < r) { if ((x - r) * (x - r) + (y - r) * (y - r) > r * r) color.a = 0; } //左上角 if (x < r && y > (height - r)) { if ((x - r) * (x - r) + (y - (height - r)) * (y - (height - r)) > r * r) color.a = 0; } //右下角 if (x > (width - r) && y < r) { if ((x - (width - r)) * (x - (width - r)) + (y - r) * (y - r) > r * r) color.a = 0; } //右上角 if (x > (width - r) && y > (height - r)) { if ((x - (width - r)) * (x - (width - r)) + (y - (height - r)) * (y - (height - r)) > r * r) color.a = 0; } return color; } ENDCG } }} |
