Three.js cinematic look: tone mapping, light, fog and bloom
From the OpenDrama Create Wiki
On default settings a Three.js scene looks like a tech demo: flat grey light, plastic materials, objects floating in a void that ends at a hard line. A "console-grade" look isn't one shader. It's seven layers applied in order: colour management, tone mapping, image-based lighting, one shadowed key light, atmosphere, restrained bloom, and a camera with a believable lens and weight. In the right order most of the gain is nearly free; out of order, no amount of light tweaking rescues the image.
Below: our starting values per layer, what you should see, and what it costs. Values are for a recent three release (r18x at the time of writing); where an API was renamed, the old name is given too.
When to use it
Use it when the game plays fine but the screenshots don't sell it. Diagnose by symptom; each one points to a missing layer:
- Washed-out colours, grey blacks. Broken colour management: a colour texture read as linear data, or gamma applied twice.
- Highlights clip to flat white; it looks like a 2005 game. No tone mapping, so everything above 1.0 is cut off.
- Metal looks black, everything else like plastic. No environment map. PBR materials need something to reflect.
- Objects float. No shadow, or one so soft and offset it reads as a smudge.
- The world feels empty and stops at a visible edge. No fog, so no aerial perspective.
- Lamps and magic don't feel hot. No bloom, or emissive never exceeds 1.0, so bloom has nothing to catch.
- It feels like a CAD viewer. Default 75° FOV, a camera glued to the player or driven by OrbitControls.
Skip it, or stop after the first two layers, for flat, pixel-art or toon styles where colours must match the painting exactly, and for 2D games.
The cost picture: colour management, tone mapping, environment light and fog are close to free per frame. A shadow re-renders every object that casts it. Bloom and other full-screen effects cost per pixel, which is where phones run out. That is also the order of value per millisecond, so apply the layers in order and stop when the 16.7 ms frame (60 fps) is spent.
Members read on
The rest of this page is for members
- 10 more steps
- 2 reference tables
- 6 more sections
Create a free account, top up once — from $0.99 — and the whole wiki is yours.
- Every breakdown, Skill and Prompt
- New pages every day
- Prompts copy in one tap
See also
Breakdowns that use this
More in AI games
View all →An anti-gravity racer in two days: three cups, online lobbies, cars made by players' AI
Stefan rebuilt his childhood favourite, F-Zero X, as the browser racer ZERO-G with AI in two days, and it was played 1,000+ times. Here's the asset pipeline and the design that makes people finish a race.
Day 20 of an AI-built strategy game: a stone golem that wakes up, and a tavern
Stefan is building the strategy game he has wanted for 15 years with AI. Day 20 adds a golem that hides as a pile of rocks and a tavern where you hire fighters. We follow the golem from reference images into Unity.
Desk photos to a playable kart racer: Gemini 4 Argon, Blender MCP and Three.js
genevieve__h from Google AI Studio turned photos of her home-office desk into a kart racing game with Gemini 4 Argon, Blender MCP and Three.js. We rebuild the method frame by frame.
One person, 16 days, Opus 5.5: The Little Prince as an explorable 3D game
Sac built a planet-by-planet 3D Little Prince with Opus 5.5, Tripo and Blender, playable in the browser. Here's the asset pipeline and how the scenes are organised.
After going viral: how Sky Reach added a Ring world and multiplayer rooms
Tesana says a user's space game, made with a few prompts, went from 2.5M to over 3M views in just over a week. Here's how it added a Ring world and multiplayer without breaking what already worked.
Lyrio: a 3D exploration game built on movement, made with Opus 5.5 and Three.js
A fox-eared scout runs, launches off Wind Springs and glides between floating islands. We break down how the movement set becomes the whole game, and how the collectibles feed it.







