1 Shader "xShader/UGUIImage"
2 {
3 Properties
4 {
5 [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
6 _Color ("Tint", Color) = (1,1,1,1)
7
8 _StencilComp ("Stencil Comparison", Float) = 8
9 _Stencil ("Stencil ID", Float) = 0
10 _StencilOp ("Stencil Operation", Float) = 0
11 _StencilWriteMask ("Stencil Write Mask", Float) = 255
12 _StencilReadMask ("Stencil Read Mask", Float) = 255
13
14 _ColorMask ("Color Mask", Float) = 15
15
16 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
17
18 // Gaussian Blur
19 _TextureSize ("_TextureSize",Float) = 256
20 _BlurRadius ("_BlurRadius",Range(0,4) ) = 3
21 // Gray
22 _Gray ("_Gray",Range(0,1) ) = 0.2
23 }
24
25 SubShader
26 {
27 Tags
28 {
29 "Queue"="Transparent"
30 "IgnoreProjector"="True"
31 "RenderType"="Transparent"
32 "PreviewType"="Plane"
33 "CanUseSpriteAtlas"="True"
34 }
35
36 Stencil
37 {
38 Ref [_Stencil]
39 Comp [_StencilComp]
40 Pass [_StencilOp]
41 ReadMask [_StencilReadMask]
42 WriteMask [_StencilWriteMask]
43 }
44
45 Cull Off
46 Lighting Off
47 ZWrite Off
48 ZTest [unity_GUIZTestMode]
49 Blend SrcAlpha OneMinusSrcAlpha
50 ColorMask [_ColorMask]
51
52 Pass
53 {
54 Name "Default"
55 CGPROGRAM
56 #pragma vertex vert
57 #pragma fragment frag
58 #pragma target 2.0
59
60 #include "UnityCG.cginc"
61 #include "UnityUI.cginc"
62
63 #pragma multi_compile __ UNITY_UI_CLIP_RECT
64 #pragma multi_compile __ UNITY_UI_ALPHACLIP
65
66 struct appdata_t
67 {
68 float4 vertex : POSITION;
69 float4 color : COLOR;
70 float2 texcoord : TEXCOORD0;
71 UNITY_VERTEX_INPUT_INSTANCE_ID
72 };
73
74 struct v2f
75 {
76 float4 vertex : SV_POSITION;
77 fixed4 color : COLOR;
78 float2 texcoord : TEXCOORD0;
79 float4 worldPosition : TEXCOORD1;
80 UNITY_VERTEX_OUTPUT_STEREO
81 };
82
83 sampler2D _MainTex;
84 fixed4 _Color;
85 fixed4 _TextureSampleAdd;
86 float4 _ClipRect;
87 float4 _MainTex_ST;
88
89 float4 _MainTex_TexelSize;
90
91 // Gaussian Blur
92 float _TextureSize;
93 float _BlurRadius;
94
95 //Gray
96 float _Gray;
97
98 float4 GetBlurColor( float2 uv,fixed4 inColor)
99 {
100 float space = 1.0/_TextureSize; //算出一个像素的空间
101 int count = _BlurRadius * 2 + 1; //取值范围
102 count *= count;
103 //将以自己为中心,周围半径的所有颜色相加,然后除以总数,求得平均值
104 float4 colorTmp = float4(0,0,0,0);
105 for( int x = -_BlurRadius ; x <= _BlurRadius ; x++ )
106 {
107 for( int y = -_BlurRadius ; y <= _BlurRadius ; y++ )
108 {
109 // float4 color = tex2D(_MainTex,uv + float2(x * space,y * space));
110 half4 color = (tex2D(_MainTex,uv + float2(x * space,y * space))) * inColor;
111 colorTmp += color;
112 }
113 }
114 return colorTmp/count;
115 }
116
117
118 v2f vert(appdata_t v)
119 {
120 v2f OUT;
121 UNITY_SETUP_INSTANCE_ID(v);
122 UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
123 OUT.worldPosition = v.vertex;
124 OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
125
126 OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
127
128 OUT.color = v.color * _Color;
129 return OUT;
130 }
131
132
133 fixed4 frag(v2f IN) : SV_Target
134 {
135
136 half4 color;
137
138 if(_BlurRadius == 0) {
139 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
140 }else {
141 // Gaussian Blur
142 color = GetBlurColor(IN.texcoord,IN.color);
143 }
144
145 // 五彩斑斓的灰
146 if(_Gray>0) {
147 float baseGray = (color.r * 0.299f + color.g * 0.578f + color.b * 0.114f);
148 color.r = baseGray * (1.0f -_Gray) + color.r * _Gray ;
149 color.g = baseGray * (1.0f - _Gray) + color.g * _Gray ;
150 color.b = baseGray * (1.0f - _Gray) + color.b * _Gray ;
151 }
152
153 #ifdef UNITY_UI_CLIP_RECT
154 color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
155 #endif
156
157 #ifdef UNITY_UI_ALPHACLIP
158 clip (color.a - 0.001);
159 #endif
160
161 return color;
162 }
163 ENDCG
164 }
165 }
166 }