Last active
October 26, 2024 07:16
-
-
Save JohannesMP/7d62f282705169a2855a0aac315ff381 to your computer and use it in GitHub Desktop.
UI.Image Blur Shader with layering and masking support
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Shader "Custom/UIBlur" | |
{ | |
Properties | |
{ | |
[Toggle(IS_BLUR_ALPHA_MASKED)] _IsAlphaMasked("Image Alpha Masks Blur", Float) = 1 | |
[Toggle(IS_SPRITE_VISIBLE)] _IsSpriteVisible("Show Image", Float) = 1 | |
// Internally enforced by MAX_RADIUS | |
_Radius("Blur Radius", Range(0, 64)) = 1 | |
_OverlayColor("Blurred Overlay/Opacity", Color) = (0.5, 0.5, 0.5, 1) | |
// see Stencil in UI/Default | |
[HideInInspector][PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} | |
[HideInInspector]_StencilComp ("Stencil Comparison", Float) = 8 | |
[HideInInspector]_Stencil ("Stencil ID", Float) = 0 | |
[HideInInspector]_StencilOp ("Stencil Operation", Float) = 0 | |
[HideInInspector]_StencilWriteMask ("Stencil Write Mask", Float) = 255 | |
[HideInInspector]_StencilReadMask ("Stencil Read Mask", Float) = 255 | |
[HideInInspector]_ColorMask ("Color Mask", Float) = 15 | |
[HideInInspector]_UseUIAlphaClip ("Use Alpha Clip", Float) = 0 | |
} | |
Category | |
{ | |
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] | |
SubShader | |
{ | |
GrabPass | |
{ | |
Tags | |
{ | |
"LightMode" = "Always" | |
"Queue" = "Background" | |
} | |
} | |
Pass | |
{ | |
Name "UIBlur_Y" | |
Tags{ "LightMode" = "Always" } | |
CGPROGRAM | |
#pragma vertex vert | |
#pragma fragment frag | |
#pragma fragmentoption ARB_precision_hint_fastest | |
#pragma multi_compile __ IS_BLUR_ALPHA_MASKED | |
#pragma multi_compile __ IS_SPRITE_VISIBLE | |
#pragma multi_compile __ UNITY_UI_ALPHACLIP | |
#include "UIBlur_Shared.cginc" | |
sampler2D _GrabTexture; | |
float4 _GrabTexture_TexelSize; | |
half4 frag(v2f IN) : COLOR | |
{ | |
half4 pixel_raw = tex2D(_MainTex, IN.uvmain); | |
return GetBlurInDir(IN, pixel_raw, _GrabTexture, _GrabTexture_TexelSize, 0, 1); | |
} | |
ENDCG | |
} | |
GrabPass | |
{ | |
Tags | |
{ | |
"LightMode" = "Always" | |
"Queue" = "Background" | |
} | |
} | |
Pass | |
{ | |
Name "UIBlur_X" | |
Tags{ "LightMode" = "Always" } | |
CGPROGRAM | |
#pragma vertex vert | |
#pragma fragment frag | |
#pragma fragmentoption ARB_precision_hint_fastest | |
#pragma multi_compile __ IS_BLUR_ALPHA_MASKED | |
#pragma multi_compile __ IS_SPRITE_VISIBLE | |
#pragma multi_compile __ UNITY_UI_ALPHACLIP | |
#include "UIBlur_Shared.cginc" | |
sampler2D _GrabTexture; | |
float4 _GrabTexture_TexelSize; | |
half4 frag(v2f IN) : COLOR | |
{ | |
half4 pixel_raw = tex2D(_MainTex, IN.uvmain); | |
#if IS_SPRITE_VISIBLE | |
return layerBlend( | |
// Layer 0 : The blurred background | |
GetBlurInDir(IN, pixel_raw, _GrabTexture, _GrabTexture_TexelSize, 1, 0), | |
// Layer 1 : The sprite itself | |
pixel_raw * IN.color | |
); | |
#else | |
return GetBlurInDir(IN, pixel_raw, _GrabTexture, _GrabTexture_TexelSize, 1, 0); | |
#endif | |
} | |
ENDCG | |
} | |
} | |
} | |
Fallback "UI/Default" | |
} |
@JohannesMP Thank you for the shader. I tried yours and another free online solution (that I got working in the first place), and yours produces a better looking blur effect.
Hello there. Just a few questions regarding this shader:
- Is it performance friendy? As in: does it work well in mobile?
- Does it work with Screen Space - Camera?
- Does it work with 2022 LTS?
Really awesome, helps me a lot
I think it is useful to build something like the floaters in eyes
You have saved my hope that chatGPT not so intelligent than people) thank you)
Great, it works on World Space canvas as well, thanks a lot!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'll gladly credit you. By the looks of it you can expect to be credited on obscure game on steam, probably around q3 of 2049 or so :)). I promise i'll let you know !
As of rewriting it, sadly not everyone is born equal, i'm untouched by ainur, and there is no shader magic running through my veins ^^.