Skip to content

Atmosphere

Atmosphere is the strangest of the screen-space types because of a Roblox engine constraint that none of the others share: only one Atmosphere can render in Lighting at a time. If you have two Atmosphere instances both parented to Lighting, only one of them visibly contributes to the rendered frame. Roblox picks one and ignores the other.

This is fine for the typical case (most games have one ambient Atmosphere baked into their scene), but it creates a problem the moment you try to emit multiple Atmosphere duplicates. Stack-emitted Atmospheres compete for the single rendering slot, producing flicker and unpredictable behaviour as Roblox switches between them frame-to-frame.

The plugin’s solution: when you Transform an Atmosphere, the plugin sets its EmissionMode attribute to "Animate" automatically (instead of the usual "Emit" default). The Animate-mode singleton-clone pattern means there’s only ever one Atmosphere duplicate alive at a time — exactly what Roblox can render.

A Roblox Atmosphere instance, parented to Lighting.

The Atmosphere doesn’t move. It applies to the entire scene as a global volumetric effect — controlling how the air itself looks. Density makes the air thicker (more haze, more attenuation over distance); Color tints that haze; Glare controls how the sun blooms when looked at directly; Decay defines how distant geometry fades into the haze.

The other screen-space types (Blur, Bloom, ColorCorrection) start with EmissionMode = "Emit" after Transform. Atmosphere starts with EmissionMode = "Animate" instead. That’s a special case Transform handles only for Atmosphere — every other type uses Emit by default, including the other screen-space types where stacking is harmless flicker rather than rendering-slot competition.

The property panel still shows the dropdown; you can change it after Transform — but doing so re-introduces the stacking problem the default protects against.

If you change Atmosphere’s EmissionMode to "Emit" and then call Particle:Emit() repeatedly, the plugin will create multiple Atmosphere duplicates. Roblox will render only one of them at a time, and the choice of which one will flicker as duplicates spawn and die. The plugin doesn’t re-enforce Animate mode at emit time — the protection is at Transform time only. If you want predictable visual output, leave the EmissionMode dropdown at Animate for Atmosphere.

The full surface area, grouped by panel section.

Panel labelData attributeTypeDefaultWhat it does
ModeEmissionModeenumAnimateStamped to Animate at Transform; leave as-is for Atmosphere
LoopAnimateLoopbooleanfalseWhether the Animate cycle loops (set to true for continuous Atmosphere animation)
EnabledEnabled (attribute)booleanfalseMaster on/off (plugin-level — Roblox Atmosphere has no native Enabled)
RateRatenumber10Unused for Atmosphere in practice (only one duplicate at a time)
LifetimeLifetimeNumberRange1Seconds per cycle of the Animate loop
Panel labelData attributeTypeDefaultWhat it does
DensityAtmDensityNumberSequence0.3How thick the atmosphere is — visibility through air
OffsetAtmOffsetNumberSequence0.25Vertical offset of the haze layer
GlareAtmGlareNumberSequence0Sun-glare intensity
HazeAtmHazeNumberSequence0Atmospheric haze depth
ColorAtmColorColorSequencelight gray (0.78, 0.78, 0.78)Atmospheric tint graph
DecayAtmDecayColorSequencebluish-gray (0.416, 0.471, 0.541)Distant-decay colour graph
Panel labelData attributeTypeDefaultWhat it does
Anim. StepsTotalKeyFramesnumber100Pre-sample resolution for the graphs
LingerPartLifenumber0Seconds the Atmosphere lingers after the cycle ends
Emit IntoEmitParentInstancenilWhere the duplicate parents — overrides Lighting

The Atm prefix on the data attributes (AtmDensity, AtmColor, etc.) avoids collision with native Roblox Atmosphere.Density, .Color, etc. — the plugin reads each panel value from the prefixed attribute and writes it to the unprefixed property on the duplicate during animation.


A NumberSequence graph for atmospheric thickness. Roblox’s Atmosphere.Density ranges from 0 (perfectly clear air) to 1 (impenetrable fog). Most authored values fall between 0.1 (light haze) and 0.5 (dense fog).

Animating Density produces a “weather changes over time” effect. A graph that ramps from 0.1 up to 0.4 and back down over a long Lifetime simulates fog rolling in and out.

A NumberSequence graph for Roblox’s Atmosphere.Offset — a normalised 0 to 1 value controlling where the haze gradient sits along the vertical axis. Lower values bias the haze toward the ground; higher values bias it toward the sky. The plugin clamps the graph to non-negative values.

The default is 0.25 — a slight ground-bias that’s a reasonable middle setting for most outdoor scenes.

A NumberSequence graph for sun-glare intensity. Higher values produce more visible bloom around the sun when looked at directly; 0 (the default) produces no extra glare.

Animating Glare upward briefly is how you sell a “the sun comes out” moment — the sky brightens, the sun visibly flares, then it settles back. Useful for cloud-clearing transitions, end-of-storm shots, magical sun-summoning effects.

A NumberSequence graph for haze depth — how thick the visual haze appears at the horizon. Different from Density (which controls air thickness uniformly); Haze affects only the distant-horizon haze band.

Combined with Density and Decay, Haze controls how distant geometry fades into the atmosphere. A high-Haze, high-Density combination makes the horizon disappear into the air; low values keep the horizon sharp.

A ColorSequence graph for atmospheric tint. The colour multiplies against the rendered scene, applied through the haze layer.

A pale-blue Color throughout life produces a normal sky-blue tinge. A graph that shifts from pale blue at age 0 to warm orange at age 1 simulates a sunset transition over the cycle’s Lifetime. A graph cycling through pale blue, white, grey, warm yellow simulates a full day-night cycle if Lifetime is long enough.

A ColorSequence graph for the distant-decay colour — what colour distant objects fade toward as the haze obscures them.

In the real world, distant mountains tend to look bluish-grey because the atmosphere scatters short-wavelength blue light. That’s the natural Decay colour. For stylised scenes, you can pick anything: distant objects fading to red would suggest a hellish or hazardous environment; fading to white suggests heavy fog or snow.

The Decay colour applies most strongly to objects far from the camera, working in combination with Haze and Density.

Default is Lighting. Atmosphere only renders when parented inside Lighting — overriding Emit Into to point elsewhere effectively disables the effect. Leave it empty for normal use.


A few Atmosphere-specific quirks.

Atmosphere has no native Enabled property. Roblox’s Atmosphere class doesn’t inherit from PostProcessEffect (the parent class for Blur/Bloom/ColorCorrection), so it lacks the Enabled boolean those types share. The plugin handles this internally — the Enabled attribute on the source Atmosphere drives the plugin’s emit-pulse logic, but the duplicate’s “always-on” rendering means there’s no equivalent flag to flip on the clone. From a user perspective, the panel still shows an Enabled toggle and behaves the way you’d expect; the difference is internal.

Don’t keep multiple Atmosphere emitters active simultaneously. Each one emits a singleton Atmosphere duplicate, and Roblox can only render one at a time. If you have two emitters running, the visible output flickers between their outputs. If you’re authoring multiple atmospheric presets (a clear-sky preset, a stormy preset, a sunset preset), keep only one emitter Enabled at any moment.

Existing baseline Atmosphere in Lighting interacts with emitted ones. Most games already have a permanent Atmosphere set up by their lighting designer for the ambient look. When you emit a transformed Atmosphere on top, Roblox swaps between the two — which usually means your emitted one wins while it’s alive, and the baseline takes over after. Plan for the swap: animate Density downward at the end of your cycle so the emitted Atmosphere fades out gracefully back to the baseline.

Don’t change EmissionMode after Transform. The plugin sets EmissionMode to Animate at Transform time, but doesn’t enforce it afterward. Switching to Emit after the fact will work mechanically but produce flickering output as Roblox arbitrates between multiple duplicates. The dropdown shows up in the panel for consistency with the other types; leave it on Animate for Atmosphere specifically.

Color and Decay are both ColorSequence graphs. Most types have at most one ColorSequence (Color for Part, TintColor for ColorCorrection). Atmosphere is the only type with two independent ColorSequence graphs. If you’ve been thinking of “the colour of the atmosphere” as a single value, it’s actually two — Color is the air’s tint, Decay is the colour distant objects fade toward.

ImageLabel is the final type in the Particiliary — and the only UI type. Where every previous type was either in 3D space or in the post-process pipeline, ImageLabel operates in the 2D GUI layer: the flat overlay that sits on top of the rendered world. Polar emission, screen-relative positioning, a different flipbook system from the mesh ones — the architectural model is unlike anything we’ve seen so far.