Skip to content

Bloom

A magic spell discharges and the screen briefly blooms into radiant white. A flashbang detonates and bright pixels explode outward into a wash of light. An explosion’s HDR pop bleeds into everything around it for a fraction of a second.

That’s Bloom. A post-process effect that takes the brightest pixels in your camera image and lets them bleed into their darker neighbours, producing a glow halo. Animated over time, it’s how you sell a moment of intense brightness — a flash, a discharge, a power-up.

A Roblox BloomEffect instance, typically parented to Lighting.

Like Blur, the BloomEffect doesn’t move; it applies to the whole rendered camera image regardless of where in the scene the bright pixels are. Transform marks the BloomEffect as a Part-Icles emitter and exposes its three animated graphs.

Bloom doesn’t make everything brighter. It only affects pixels above a brightness threshold. That’s what Threshold controls — and it’s the one knob that decides which parts of the scene contribute to the bloom. Lower the Threshold and more of the scene starts blooming (any moderately bright pixel contributes); raise it and only the brightest pixels do.

Once Bloom has decided which pixels qualify, two more knobs shape the look. Intensity controls how strongly those pixels glow; Size controls how far the glow spreads from each contributing pixel.

The three interact. A low Threshold + low Intensity + small Size produces a subtle pastel glow on much of the scene. A high Threshold + high Intensity + large Size produces dramatic localised flashes from only the brightest objects. Different combinations give you different aesthetics — soft dreamy bloom vs. punchy HDR flares.

The full surface area, grouped by panel section.

Panel labelData attributeTypeDefaultWhat it does
ModeEmissionModeenumEmitEmit (per-emission clones) or Animate (singleton clone, looping)
LoopAnimateLoopbooleanfalseWhether Animate mode loops the cycle
EnabledEnabled (attribute)booleanfalseMaster on/off
RateRatenumber10Emit rate per second (Emit mode only)
LifetimeLifetimeNumberRange1Seconds each clone lives
Panel labelData attributeTypeDefaultWhat it does
IntensityBloomIntensityNumberSequence0.4Glow strength graph
SizeBloomSizeNumberSequence24Glow spread radius graph, in pixels
ThresholdBloomThresholdNumberSequence0.95Brightness cutoff graph — only pixels above this glow
Panel labelData attributeTypeDefaultWhat it does
Anim. StepsTotalKeyFramesnumber100Pre-sample resolution for the graphs
LingerPartLifenumber0Seconds the clone lingers after Lifetime
Emit IntoEmitParentInstancenilWhere the clone parents — overrides Lighting

A NumberSequence graph that controls how strongly bright pixels bloom. Higher values produce more visible glow.

Roblox’s BloomEffect.Intensity is unbounded — a value of 5 is a strong bloom, 10 is overpowering, 20 saturates the screen entirely. For most flash-style effects, a graph that peaks somewhere in the 26 range and decays back to 01 produces a clean radiant burst.

The data attribute is BloomIntensity to disambiguate from native Roblox BloomEffect.Intensity.

A NumberSequence graph for the bloom spread radius, in pixels. Larger values produce a wider, softer halo around bright pixels; smaller values produce tight, focused glow.

A Size = 24 (Roblox’s typical default) produces a moderate spread. A Size = 8 produces sharp localised glow. A Size = 56 produces a wide diffuse wash.

For a “tight flash” effect, a small Size combined with high Intensity produces a punchy, localised burst. For an “ethereal glow” effect, a larger Size combined with moderate Intensity produces a softer, dreamier halo. Both are useful in different contexts.

A NumberSequence graph for the brightness cutoff. Pixels brighter than this value contribute to the bloom; pixels at or below it don’t.

Roblox uses a normalised brightness scale — 1.0 corresponds roughly to “fully white in standard rendering,” and values above represent HDR (high dynamic range) intensities. Neon-material parts, emissive surfaces, and sufficiently lit white surfaces routinely exceed 1.0 in Roblox’s HDR pipeline.

A Threshold = 0.5 makes most of a sunlit scene bloom (anything moderately bright qualifies). A Threshold = 0.95 (the default) makes only near-white pixels bloom — Neon parts, explosion flashes, sun glints. A Threshold = 5.0 confines the bloom to only the brightest HDR pixels in the scene.

For a “selective flash” effect, animate Threshold downward during the emission’s peak and back up at the end. The threshold drop briefly lets more pixels into the bloom, producing a momentary scene-wide glow. The threshold rise restricts the bloom back to its baseline.

Bloom uses the same singleton-clone pattern as Blur — and for the same reason. Multiple BloomEffects in Lighting do compose in Roblox; their Intensity and Size values stack on top of each other into a single brighter, wider final bloom. That’s exactly the problem at high Emit-mode rates: each short-lived BloomEffect clone adds to the running total, the bloom escalates frame by frame, then drops as clones expire. The result reads as flicker or runaway. Two effects each driving their own Bloom emitter on top of one another also clobber intent.

So when EmissionMode = "Animate":

  1. One duplicate BloomEffect is created in Lighting (or EmitParent).
  2. The three graphs play over the duplicate’s Lifetime.
  3. With AnimateLoop = true, the cycle restarts when it ends.
  4. Re-emit calls while the duplicate is alive are silently dropped — a second Emit call (from the same emitter or another effect’s emit pulse on the same instance) is a no-op until the active cycle finishes.
  5. The duplicate is destroyed when its Lifetime ends (with AnimateLoop = false).

This is a plugin-level protection, not a Roblox engine constraint. The only screen type Roblox itself enforces as a singleton is Atmosphere — Bloom, Blur, and ColorCorrection all support multiple instances with their values compounded.

For Emit mode, this protection isn’t active. Use Animate mode for any Bloom that should run continuously while enabled.

Same role as on Blur. Default is Lighting; override to a custom container if you need to. For Bloom, the duplicate must be parented inside Lighting to render — overriding Emit Into away from Lighting effectively disables the effect.

A few Bloom-specific quirks.

Bloom amplifies bright pixels regardless of source. If your scene already has many Neon parts, bright UI, or HDR-lit surfaces, your Bloom emitter affects all of them, not just the moment you’re trying to draw attention to. Audit your scene’s existing brightness profile before authoring a Bloom — what looks subtle in a daylight scene may be overwhelming in a dark scene.

Bloom composes with existing Lighting effects. If your Lighting already contains a BloomEffect (a permanent ambient bloom set by your game’s lighting designer), an emitted Bloom layers on top of it. The result can be unintentionally extreme. Either disable the permanent BloomEffect during the emission, or design the emitted graph with the existing baseline in mind.

For localised glows, prefer a Part-emitter approach. Bloom is a global post-process; it can’t tell “make this object glow” from “make the whole screen glow.” A Part emitter with a high Brightness graph and an emissive material, or a PointLight with strong Range, gets you a localised glow with less collateral than a Bloom emitter.

Threshold has no 0 floor. Setting Threshold to 0 does not mean “no bloom” — it means “every pixel above zero brightness blooms,” which is most of them. To turn off bloom, set Intensity to 0, not Threshold.

ColorCorrection is the third post-process emitter type. Where Blur has one graph and Bloom has three, ColorCorrection has four — Brightness, Contrast, Saturation, and a ColorSequence Tint. The signed-graph behaviour (negative values are valid, unlike most plugin graphs) is worth flagging up front.