-
-
Save JohannesMP/7d62f282705169a2855a0aac315ff381 to your computer and use it in GitHub Desktop.
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" | |
} |
Does this work with URP ?
Does this work with URP ?
I have not tested it, I don’t use URP as part of my workflow yet.
In a topic on the Unity forums where I shared this originally, someone mentioned that they made a version based on mine that worked with URP: https://forum.unity.com/threads/solved-dynamic-blurred-background-on-ui.345083/page-2#post-6281381
if i switch my canvas from Screen Space - Camera to Screen Space - Overlay it starts to work.
I cannot do that in my app, as there are few requirements which need the canvas to be in that mode, but I am trying to find out why it will not work.
Hi, I've been using your shader for my project and I've got two reports about a strange bug with UI (https://gyazo.com/09493cad4ff14d28a42008e563042108). It doesn't happen on any of my devices so it's hard for me to find the problem. I know nothing about shaders, but maybe you can help identify the problem or a least exclude your shader from causing it? The person who sent me this screenshot has RTX 2060 Super, so I doubt that's a hardware incompatibility problem.
Hello. Shader works great!. Can the code be used freely in commercial projects?
Hello. Shader works great!. Can the code be used freely in commercial projects?
Please absolutely feel free! If you do end up using it I’d love to know :)
As far as Licensing is concerned I am releasing this under the MIT License, so you are allowed to do what you wish but I also assume no responsibility in case (however unlikely) that it breaks anything. You are using code from the internet, so please exercise due diligence :)
If you can credit me, great, but I don’t require it.
Lastly I would still encourage you to write your own version to suit your specific needs. This has not been optimized or tested on various hardware configurations, and is primarily intended as a proof of concept to use as a starting point for anyone wishing to implement a similar effect.
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 ^^.
@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!
This was developed on PC and I have not tested other platforms. It is shared here mainly as reference for anyone else writing their own shaders