§ How to · with Picoo

How to set up lighting and atmosphere in Roblox

By Sametcan Tasgiran, Founder & Developer·Published ·Updated

Lighting is the cheapest thing you can change that makes a Roblox game stop looking like a Roblox game.

It is also full of settings that silently cancel each other out — an Atmosphere that makes your fog values do nothing, a Technology mode where your torches cast no shadow.

Mood presets

Coherent sets of ClockTime, Ambient, Brightness and ColorShift rather than sliders moved at random.

Atmosphere, not fog

Density, Haze, Glare and Offset — the modern depth system, applied consistently.

Correct Technology

The lighting mode is chosen for the effect you asked for, not left on default.

Post-effect stack

Bloom, ColorCorrection, DepthOfField and SunRays configured together, with their cost in mind.

Skybox and horizon

Sky, sun and moon sized and coloured to match the ground lighting.

Interior lighting

Local lights placed and ranged so rooms read without flattening everything.

Files Picoo ships for this prompt

2 files · 140 lines · ~25s · 1 credit

LightingPreset

Named presets, applied atomically to Lighting and its children.

95 lines

AtmosphereTuner

Atmosphere instance setup with the values each preset expects.

45 lines

Sample output: ServerScriptService.LightingPreset

-- Two settings cancel other settings, and both are quiet about it.
--
-- 1. An Atmosphere instance under Lighting REPLACES the old fog system. Once it
--    exists, Lighting.FogStart / FogEnd / FogColor do nothing at all. Editing
--    fog while an Atmosphere is present is the classic "nothing happens" bug.
-- 2. Lighting.Technology decides whether local lights cast shadows. Voxel does
--    not shadow from PointLight / SpotLight / SurfaceLight. If you want a torch
--    to throw a shadow, Technology must be Future.
local function applyPreset(name: string)
	local p = PRESETS[name]
	if not p then return end

	Lighting.Technology = p.needsLocalShadows
		and Enum.Technology.Future
		or Enum.Technology.ShadowMap

	Lighting.ClockTime = p.clockTime        -- 0-24; TimeOfDay is the string form
	Lighting.Brightness = p.brightness
	Lighting.Ambient = p.ambient
	Lighting.OutdoorAmbient = p.outdoorAmbient
	Lighting.ExposureCompensation = p.exposure

	local atmos = Lighting:FindFirstChildOfClass("Atmosphere")
		or Instance.new("Atmosphere", Lighting)
	atmos.Density = p.density               -- 0.3 clear, 0.6 hazy, 0.9 soup
	atmos.Haze = p.haze
	atmos.Glare = p.glare
	atmos.Color = p.atmosColor
end

How to set up lighting and atmosphere in Roblox

Nothing changes how a Roblox place feels as fast as its lighting, and nothing wastes as much time as lighting settings that quietly override each other.

The first is fog. Roblox has two depth systems: the old FogStart/FogEnd properties on Lighting, and the newer Atmosphere object. When an Atmosphere exists as a child of Lighting, the fog properties stop doing anything — not partially, entirely. Because most modern templates ship with an Atmosphere already in place, the usual experience is opening Lighting, dragging FogEnd around, and watching absolutely nothing change. Tune Density and Haze on the Atmosphere instead.

The second is shadows. Lighting.Technology looks like a quality preset and behaves like a feature switch. Voxel renders no shadows from PointLight, SpotLight or SurfaceLight. ShadowMap adds sun shadows but still not local ones. Only Future gives a torch, a lamp or a muzzle flash a real shadow — and it is genuinely heavier on low-end phones, so it is a decision, not a default.

After that it is composition. ClockTime and Brightness set the key light; Ambient and OutdoorAmbient decide how black your shadows go; ExposureCompensation shifts the whole image without touching individual lights. Post effects sit on top: ColorCorrection costs almost nothing and carries most of the mood, Bloom sells bright sources, and DepthOfField plus SunRays are the expensive pair that new projects reliably overuse.

One practical rule: change these as named presets, not as individual sliders. A preset that sets all of the values together can be reapplied, compared and reverted. A place where six properties were nudged over three sessions cannot be returned to how it looked last week.

See more on the Luau generator, the game builder, or browse the full blog.

Frequently asked

Why does changing FogEnd do nothing?+

There is an Atmosphere object under Lighting. Atmosphere replaces the legacy fog system outright — while it exists, FogStart, FogEnd and FogColor are ignored. Either tune Atmosphere.Density and Haze instead, or delete the Atmosphere if you genuinely want old-style fog.

Why don't my torches cast shadows?+

Lighting.Technology. Under Voxel, PointLight, SpotLight and SurfaceLight do not cast shadows at all; ShadowMap gives you shadows from the sun but still not from local lights. Only Future shadows local lights — and it costs more on low-end devices, which is the trade you are actually making.

ClockTime or TimeOfDay?+

The same value in two forms — ClockTime is a number from 0 to 24, TimeOfDay is a "HH:MM:SS" string. Set either; they stay in sync. Scripts want ClockTime because arithmetic on a number is trivial and arithmetic on a timestamp string is not.

Which post effects are worth the cost?+

ColorCorrection is nearly free and does the most for mood — a little saturation and tint changes a scene completely. Bloom is cheap and sells bright light sources. DepthOfField and SunRays are the expensive ones and the easiest to overdo; on mobile they are the first things worth cutting.

Does lighting have to be set on the server?+

Lighting properties replicate, so setting them on the server gives every player the same world — which is what you want for a day-night cycle. Per-player effects (a damage flash, an underwater tint) belong on the client, since they are not part of the shared world state.

Related Picoo prompts