§ 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
endHow 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
Roblox day night cycle
3 files · 90 lines · 28 seconds · 1 credit. 24-minute realtime full cycle, configurable.
custom camera in Roblox
Cameras are client-only, and every reliable camera in Roblox comes down to three things: the right CameraType, the right update event, and framerate-independent smoothing.
Roblox magic spell system
7 files · 240 lines · 1m 06s · 1 credit. 5 spell archetypes, configurable.