@@ -28,14 +28,6 @@ Shader "ReactUnity/BackdropFilter"
28
28
}
29
29
30
30
Category {
31
- Tags {
32
- "Queue" = "Transparent"
33
- "IgnoreProjector" = "True"
34
- "RenderType" = "Transparent"
35
- "PreviewType" = "Plane"
36
- "CanUseSpriteAtlas" = "True"
37
- }
38
-
39
31
Stencil {
40
32
Ref [_Stencil]
41
33
Comp [_StencilComp]
@@ -51,6 +43,228 @@ Shader "ReactUnity/BackdropFilter"
51
43
Blend SrcAlpha OneMinusSrcAlpha
52
44
ZWrite Off
53
45
46
+ Tags {
47
+ "Queue" = "Transparent"
48
+ "IgnoreProjector" = "True"
49
+ "RenderType" = "Transparent"
50
+ "PreviewType" = "Plane"
51
+ "CanUseSpriteAtlas" = "True"
52
+ }
53
+
54
+ SubShader {
55
+ Tags {
56
+ "RenderPipeline" = "UniversalPipeline"
57
+ }
58
+
59
+ Pass {
60
+ CGPROGRAM
61
+ #pragma vertex vert
62
+ #pragma fragment frag
63
+ #pragma target 2.0
64
+ #pragma shader_feature_local _SPECULARHIGHLIGHTS_OFF
65
+ #pragma shader_feature_local _GLOSSYREFLECTIONS_OFF
66
+ #pragma fragmentoption ARB_precision_hint_fastest
67
+ #define GRAB_POS
68
+ #include "UnityCG.cginc"
69
+ #include "ShaderSetup.cginc"
70
+
71
+ float _Blur;
72
+
73
+ sampler2D _CameraOpaqueTexture;
74
+ float4 _CameraOpaqueTexture_TexelSize;
75
+ #define BACKDROP_TEX _CameraOpaqueTexture
76
+ #define BACKDROP_TEXELSIZE _CameraOpaqueTexture_TexelSize
77
+
78
+ float4 frag ( v2f i ) : COLOR {
79
+ if (_Blur == 0 ) return float4 (0 ,0 ,0 ,0 );
80
+
81
+ float3 sum = float3 (0 ,0 ,0 );
82
+
83
+ #define GRABPIXEL (weight,kernelx) tex2D ( BACKDROP_TEX, UNITY_PROJ_COORD (float2 (i.uvgrab.x + BACKDROP_TEXELSIZE.x * kernelx*_Blur, i.uvgrab.y))) * weight
84
+
85
+ sum += GRABPIXEL (0.05 , -4.0 );
86
+ sum += GRABPIXEL (0.09 , -3.0 );
87
+ sum += GRABPIXEL (0.12 , -2.0 );
88
+ sum += GRABPIXEL (0.15 , -1.0 );
89
+ sum += GRABPIXEL (0.18 , 0.0 );
90
+ sum += GRABPIXEL (0.15 , +1.0 );
91
+ sum += GRABPIXEL (0.12 , +2.0 );
92
+ sum += GRABPIXEL (0.09 , +3.0 );
93
+ sum += GRABPIXEL (0.05 , +4.0 );
94
+
95
+ return float4 (sum, 1 );
96
+ }
97
+ ENDCG
98
+ }
99
+
100
+ Pass {
101
+ CGPROGRAM
102
+ #pragma vertex vert
103
+ #pragma fragment frag
104
+ #pragma target 2.0
105
+ #pragma shader_feature_local _SPECULARHIGHLIGHTS_OFF
106
+ #pragma shader_feature_local _GLOSSYREFLECTIONS_OFF
107
+ #pragma fragmentoption ARB_precision_hint_fastest
108
+ #define GRAB_POS
109
+ #include "UnityCG.cginc"
110
+ #include "ShaderSetup.cginc"
111
+
112
+ float _Blur;
113
+
114
+ sampler2D _CameraOpaqueTexture;
115
+ float4 _CameraOpaqueTexture_TexelSize;
116
+ #define BACKDROP_TEX _CameraOpaqueTexture
117
+ #define BACKDROP_TEXELSIZE _CameraOpaqueTexture_TexelSize
118
+
119
+ float4 frag ( v2f i ) : COLOR {
120
+ if (_Blur == 0 ) return float4 (0 ,0 ,0 ,0 );
121
+
122
+ float3 sum = float3 (0 ,0 ,0 );
123
+
124
+ #define GRABPIXEL (weight,kernely) tex2D ( BACKDROP_TEX, UNITY_PROJ_COORD (float2 (i.uvgrab.x, i.uvgrab.y + BACKDROP_TEXELSIZE.y * kernely*_Blur))) * weight
125
+
126
+ sum += GRABPIXEL (0.05 , -4.0 );
127
+ sum += GRABPIXEL (0.09 , -3.0 );
128
+ sum += GRABPIXEL (0.12 , -2.0 );
129
+ sum += GRABPIXEL (0.15 , -1.0 );
130
+ sum += GRABPIXEL (0.18 , 0.0 );
131
+ sum += GRABPIXEL (0.15 , +1.0 );
132
+ sum += GRABPIXEL (0.12 , +2.0 );
133
+ sum += GRABPIXEL (0.09 , +3.0 );
134
+ sum += GRABPIXEL (0.05 , +4.0 );
135
+
136
+ return float4 (sum, 1 );
137
+ }
138
+ ENDCG
139
+ }
140
+
141
+ Pass {
142
+ CGPROGRAM
143
+ #pragma vertex vert
144
+ #pragma fragment frag
145
+ #pragma target 2.0
146
+ #pragma shader_feature_local _SPECULARHIGHLIGHTS_OFF
147
+ #pragma shader_feature_local _GLOSSYREFLECTIONS_OFF
148
+ #pragma fragmentoption ARB_precision_hint_fastest
149
+ #define GRAB_POS
150
+ #include "UnityCG.cginc"
151
+ #include "UnityUI.cginc"
152
+ #include "ShaderSetup.cginc"
153
+
154
+ #pragma multi_compile_local _ UNITY_UI_CLIP_RECT
155
+ #pragma multi_compile_local _ UNITY_UI_ALPHACLIP
156
+
157
+ float _Blur;
158
+ float _Brightness;
159
+ float _Contrast;
160
+ float _Grayscale;
161
+ float _HueRotate;
162
+ float _Invert;
163
+ float _Opacity;
164
+ float _Saturate;
165
+ float _Sepia;
166
+ float _Pixelate;
167
+ float _Grain;
168
+
169
+ float4 _ClipRect;
170
+
171
+ sampler2D _CameraOpaqueTexture;
172
+ float4 _CameraOpaqueTexture_TexelSize;
173
+ #define BACKDROP_TEX _CameraOpaqueTexture
174
+ #define BACKDROP_TEXELSIZE _CameraOpaqueTexture_TexelSize
175
+
176
+ // Convert RGB to Grayscale
177
+ float3 rgb2gray (float3 color)
178
+ {
179
+ return dot (color, float3 (0.299 , 0.587 , 0.114 ));
180
+ }
181
+
182
+ // Convert RGB to HSV for Hue and Saturation adjustments
183
+ float3 rgb2hsv (float3 c)
184
+ {
185
+ float4 K = float4 (0.0 , -1.0 / 3.0 , 2.0 / 3.0 , -1.0 );
186
+ float4 p = lerp (float4 (c.bg, K.wz), float4 (c.gb, K.xy), step (c.b, c.g));
187
+ float4 q = lerp (float4 (p.xyw, c.r), float4 (c.r, p.yzx), step (p.x, c.r));
188
+
189
+ float d = q.x - min (q.w, q.y);
190
+ float e = 1. 0e-10 ;
191
+ return float3 (abs (q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
192
+ }
193
+
194
+ // Convert HSV to RGB
195
+ float3 hsv2rgb (float3 c)
196
+ {
197
+ float4 K = float4 (1.0 , 2.0 / 3.0 , 1.0 / 3.0 , 3.0 );
198
+ float3 p = abs (frac (c.xxx + K.xyz) * 6.0 - K.www);
199
+ return c.z * lerp (K.xxx, saturate (p - K.xxx), c.y);
200
+ }
201
+
202
+ float rand (float2 co)
203
+ {
204
+ return frac (sin (dot (co.xy, float2 (12.9898 , 78.233 ))) * 43758.5453 );
205
+ }
206
+
207
+ float4 frag (v2f i) : SV_Target
208
+ {
209
+ float2 uvgrab = i.uvgrab;
210
+
211
+ // Apply pixelate effect
212
+ if (_Pixelate > 0 )
213
+ {
214
+ float4 ts = BACKDROP_TEXELSIZE * _Pixelate;
215
+ uvgrab = round (i.uvgrab / ts.xy) * ts.xy;
216
+ }
217
+
218
+ // Grab the texture from behind the current object
219
+ float3 color = tex2D (BACKDROP_TEX, uvgrab).rgb;
220
+
221
+ // Convert to grayscale if needed
222
+ if (_Grayscale > 0 )
223
+ {
224
+ float gray = rgb2gray (color);
225
+ color = lerp (color, float3 (gray, gray, gray), _Grayscale);
226
+ }
227
+
228
+ // Adjust brightness and contrast
229
+ color = color * _Brightness;
230
+ color = (color - 0.5 ) * _Contrast + 0.5 ;
231
+
232
+ // Adjust hue and saturation
233
+ float3 hsv = rgb2hsv (color);
234
+ hsv.x += _HueRotate / 360.0 ;
235
+ hsv.y *= _Saturate;
236
+ color = hsv2rgb (hsv);
237
+
238
+ // Apply sepia effect
239
+ if (_Sepia > 0 )
240
+ color = lerp (color, float3 (dot (color, float3 (0.393 , 0.769 , 0.189 )), dot (color, float3 (0.349 , 0.686 , 0.168 )), dot (color, float3 (0.272 , 0.534 , 0.131 ))), _Sepia);
241
+
242
+ // Invert
243
+ if (_Invert > 0 )
244
+ color = lerp (color, 1 - color, _Invert);
245
+
246
+ // Apply grain
247
+ if (_Grain > 0 )
248
+ color += (0.5 - rand (i.uv)) * _Grain;
249
+
250
+ float4 res = float4 (color, _Opacity);
251
+
252
+
253
+ #ifdef UNITY_UI_CLIP_RECT
254
+ res.a *= UnityGet2DClipping (i.worldPosition.xy, _ClipRect);
255
+ #endif
256
+
257
+ #ifdef UNITY_UI_ALPHACLIP
258
+ clip (res.a - 0.001 );
259
+ #endif
260
+
261
+ return res;
262
+ }
263
+
264
+ ENDCG
265
+ }
266
+ }
267
+
54
268
SubShader {
55
269
GrabPass { }
56
270
@@ -67,15 +281,18 @@ Shader "ReactUnity/BackdropFilter"
67
281
#include "ShaderSetup.cginc"
68
282
69
283
float _Blur;
284
+
70
285
sampler2D _GrabTexture;
71
286
float4 _GrabTexture_TexelSize;
287
+ #define BACKDROP_TEX _GrabTexture
288
+ #define BACKDROP_TEXELSIZE _GrabTexture_TexelSize
72
289
73
290
float4 frag ( v2f i ) : COLOR {
74
291
if (_Blur == 0 ) return float4 (0 ,0 ,0 ,0 );
75
292
76
293
float3 sum = float3 (0 ,0 ,0 );
77
294
78
- #define GRABPIXEL (weight,kernelx) tex2D ( _GrabTexture , UNITY_PROJ_COORD (float2 (i.uvgrab.x + _GrabTexture_TexelSize .x * kernelx*_Blur, i.uvgrab.y))) * weight
295
+ #define GRABPIXEL (weight,kernelx) tex2D ( BACKDROP_TEX , UNITY_PROJ_COORD (float2 (i.uvgrab.x + BACKDROP_TEXELSIZE .x * kernelx*_Blur, i.uvgrab.y))) * weight
79
296
80
297
sum += GRABPIXEL (0.05 , -4.0 );
81
298
sum += GRABPIXEL (0.09 , -3.0 );
@@ -107,15 +324,18 @@ Shader "ReactUnity/BackdropFilter"
107
324
#include "ShaderSetup.cginc"
108
325
109
326
float _Blur;
327
+
110
328
sampler2D _GrabTexture;
111
329
float4 _GrabTexture_TexelSize;
330
+ #define BACKDROP_TEX _GrabTexture
331
+ #define BACKDROP_TEXELSIZE _GrabTexture_TexelSize
112
332
113
333
float4 frag ( v2f i ) : COLOR {
114
334
if (_Blur == 0 ) return float4 (0 ,0 ,0 ,0 );
115
335
116
336
float3 sum = float3 (0 ,0 ,0 );
117
337
118
- #define GRABPIXEL (weight,kernely) tex2D ( _GrabTexture , UNITY_PROJ_COORD (float2 (i.uvgrab.x, i.uvgrab.y + _GrabTexture_TexelSize .y * kernely*_Blur))) * weight
338
+ #define GRABPIXEL (weight,kernely) tex2D ( BACKDROP_TEX , UNITY_PROJ_COORD (float2 (i.uvgrab.x, i.uvgrab.y + BACKDROP_TEXELSIZE .y * kernely*_Blur))) * weight
119
339
120
340
sum += GRABPIXEL (0.05 , -4.0 );
121
341
sum += GRABPIXEL (0.09 , -3.0 );
@@ -135,7 +355,6 @@ Shader "ReactUnity/BackdropFilter"
135
355
GrabPass { }
136
356
137
357
Pass {
138
-
139
358
CGPROGRAM
140
359
#pragma vertex vert
141
360
#pragma fragment frag
@@ -164,8 +383,11 @@ Shader "ReactUnity/BackdropFilter"
164
383
float _Grain;
165
384
166
385
float4 _ClipRect;
386
+
167
387
sampler2D _GrabTexture;
168
388
float4 _GrabTexture_TexelSize;
389
+ #define BACKDROP_TEX _GrabTexture
390
+ #define BACKDROP_TEXELSIZE _GrabTexture_TexelSize
169
391
170
392
// Convert RGB to Grayscale
171
393
float3 rgb2gray (float3 color)
@@ -205,12 +427,12 @@ Shader "ReactUnity/BackdropFilter"
205
427
// Apply pixelate effect
206
428
if (_Pixelate > 0 )
207
429
{
208
- float4 ts = _GrabTexture_TexelSize * _Pixelate;
430
+ float4 ts = BACKDROP_TEXELSIZE * _Pixelate;
209
431
uvgrab = round (i.uvgrab / ts.xy) * ts.xy;
210
432
}
211
433
212
434
// Grab the texture from behind the current object
213
- float3 color = tex2D (_GrabTexture , uvgrab).rgb;
435
+ float3 color = tex2D (BACKDROP_TEX , uvgrab).rgb;
214
436
215
437
// Convert to grayscale if needed
216
438
if (_Grayscale > 0 )
0 commit comments