Objectual UI Blur [1.2 / REVISION 2]

I’ve created a remake of this resource with the goal of improving clarity and performance. My version is structured as a single, type-safe module with around 170 lines of code. In terms of optimization, the original approach involved cloning and parenting a local script that generated multiple Parts using SpecialMeshes set to Wedge, rather than using WedgeParts. My module simplifies this by creating a single part designed to cover the entire frame and automatically hides it when the ScreenGui or Frame is not visible.


Usage:

Code-wise
REVISION 1

If you only want to handle blurring manually, then the module presents 3 simple functions (which you’d need only 2) for usage:

  • .new(GuiObject: GuiObject, Arguments: UIBlurArguments) : UIBlur
    This function simply creates the blur effect on a (usually Frame) GuiObject instance. The arguments table accept as follows:
{
	Corner : number?, -- 0 - 3
	Fragmented : boolean?, -- Little sunlight effect using displaced geometry
	Inverted : boolean?, -- Inverts the screen colors for that particular GuiObject
	DisableBelowNeededGraphics : boolean?, -- Disables the blur effect if the "QualityLevel" is set to a value below 8
}
  • Update(self: UIBlur) simply updates the blur effect. This is a function which you don’t need to call since the module already updates the effect Pre-Render.

  • Destroy(self: UIBlur) simply destroys the blur effect (not the BlurEffect instance, see Object-wise for info) and clears the little resources it used.

For an example on how to use, you simply:

local UIBlur = require(game.ReplicatedStorage.UIBlur)
UIBlur.new(script.Parent.Frame)

Object-wise

If the module’s AutoAddEnabled attribute is enabled, the module will automatically* scan the Player’s PlayerGui for BlurEffect instances, and apply a blur effect accordingly. Setting the BlurEffect.Enabled to false also disables the blur, like the real thing!

*Note: for the auto-adder to work, the module should be required, but only that! No need to actually use the .new function.


Features (BloatWare):

Corners?
REVISION 1

Yes, the module uses a pre-modelled MeshPart instead of a regular part for rounding. Corners also support fragmentation! This method isn’t that good either, because on 1:1 ratios the corner will look stretched, but this is best for buttons.

  • Level 1 is a barely rounded square
  • Level 2 is a square rounded 50% of the way
  • Level 3 is a circle
REVISION 2

Corners are automatically created using complicated math, but objectively look better, and also auto-update:




All with the same line of code!

Bugs

Fragmented + inverted’s corners are missing a few triangles, can’t pinpoint why.


Fragmentation?

Yes, since the parts used to make the blur are Glass-material, with some neat geometry one could make a “shiny” bloom just like below (third frame):

Inverted colors?

Yes, using a cool little trick from a tutorial (linked in the Update Log) I also added this functionality. Beware that it might look too crisp for simple usage, so I recommend turning this on only for a square Frame. The sample place file provided below also features a ColorCorrection effect (disabled by default).


Make sure the version of the module (found at line 5) and this post’s title match to get the latest product!


Despite the name, I think this may have become too bloated.
Please let me know if you encounter any issues/bugs, or have improvement ideas!


Update Log

17 June 2025

  • Added objectual creation (BlurEffect inside GuiObject) to revision 2
  • Updated sample place file for better visualization

14 June 2025

  • Recreated the entirety of the module to use another method of rounding. Using this revision is completely optional, but the earlier version will not be updated anymore. I’m gonna add bug fixes and customization to the second revision as time goes on.

11 June 2025

  • If the Corner argument was passed as “0”, internally it becomes nil (0 is no corner).

2 June 2025

  • Update Log forgot we’re in 2025
  • Improved typechecking for functions

16 May 2025

  • Changed how arguments passed on Blur creation are made, please update all your scripts accordingly (I know I should’ve done this when I added Fragmentation sorry)
  • Added inverted colors (thanks to this tutorial)

11 May 2025

  • Added fragmentation (order of arguments changed!)
  • Added variable depth scaling depending on the Corner used (DepthOfField is weird)

26 April 2025

  • Added a sample place file

25 April 2025

  • Added functionality to the corner argument
  • Updated Part.Size formula
50 Likes

This is a remake of a remake of a remake lol

Remakes are meant to be better :upside_down_face:

7 Likes

Hello! Could you please provide a testing place? Thanks!

There, it’s pretty easy to use nonetheless but whatever:


There seems to be a split between the blur and the edge of the ui?
image
And this one is larger than the ui

2 Likes

That’s odd, thought I fixed that. Is it the newest version of the module? If it is, I’ll look at the sizing formula right when I get home

It is yea, I dunno what’s causing it

Alright, I’ve done some changes to how the sizing is handled, so make sure to update the module (if it hasn’t automatically, the current version is 2.4. If it still looks weird, that’s simply because of how the DepthOfField renders blur, which in turn I’ll have to make the module account for that (by making the 3D part smaller)

I wish there was a way to do ui blur that worked for low graphics quality… Still a neat resource though, didnt know you could use dof like that :V :heart:

Thank you, I tried using SurfaceAppearances with Transparency for lower graphics, however they don’t work either… Unfortunately, even though “Blur” can be rendered at the lowest level, it cannot be “shaped” to match a part of the screen. Surely, if anything possible comes up, I’ll make sure to update the module!

1 Like

Maybe surfaceGuis could work?
TEXT LIMIT AHHHHH

SurfaceGuis don’t help at all. You might be thinking to put that SurfaceAppearance’ image into an ImageLabel on the blurry part, but images don’t work like that.

Hi, it would be cool if you could let us change the blur intensity with an attribute just like in the original post

Hello, sure I can attempt to do that, but it’s not a simple process (such as tweaking transparency of the part). I’ll come back with updates!

3 Likes

While you commented the corner variable about the minimum and maximum value (from 0 to 3), the module throws an error that the instance named ‘0’ is missing from the “Corners” folder.

Imported again, and the mesh “0” instance is still missing.


image

Hm, I haven’t explained the tomfoolery this module is doing. 0 is missing in this case because 0 is essentially no corner, which is auto-created by the module (as a simple Part) when initializing. You can skip the Corner argument if you don’t want corners, it’ll automatically assume you don’t want one. But yes, I’ll add a safeguard.