Why Colours 'Blow Out' With Lighting
When people describe blown-out colours in level design, they usually mean that parts of the scene look overly bright, washed out, or unnaturally intense, as if detail has been lost in a glare. This comes from how lighting interacts with both the engine's rendering pipeline and the textures being lit.
This is one of the drawbacks from an engine with Limited Dynamic Range. Modern engines use HDR (high dynamic range) and tone mapping to compress brightness into a range the monitor can display. Older engines like idTech 3 don't. That means once something is brighter than the displayable max, detail is gone.
Level designers need to manually balance light intensities, surface colours, and shaders to keep the scene readable without the assistance of modern tone mapping.
Light Intensity & Texture Brightness
These are the most common two reasons why colours can blow out in IdTech3. If a light entity is set too strong (higher intensity or too many overlapping lights), the brightness values pushed onto a surfaces around the light entity can exceed the intended colour range. Older game engine typically clamp colours to a limited range (0-1 or 0-255 depending on precision), anything brighter than the maximum just flattens out. Instead of showing more detail, the colour clips to pure white (or a saturated channel), causing that blown-out look.
Avoid extreme light values with pointlights and spotlights. Rarely ever should you exceed the maximum intensity value 1000. Instead you should spread illumination across multiple smaller lights. Any spotlights should be used with attenuation in mind(cone falloff), instead of a huge omnidirectional light to reduce hot spots.
Don't use pure white texutres or textures with close-to-white colours. This is because white surfaces under bright light blow out instantly. Level Designers used to tint whiter textures slightly grey or coloured so they would still hold detail when lit.
This chart shows the colour gradients under different light intensities:
- 0.5× → Dim, detail preserved.
- 1.0× → Full range visible.
- 2.0× → Overbright begins flattening, strongest at the white gradient.
- 4.0× → Extreme blowout, RGB channels clip to full intensity, white loses all detail while colours become highly saturated.
Additive & Blended Lighting
Certain shaders or blendmodes use additive blending, where each overlapping light or texture layer adds its colour values directly. This stacks brightness quickly. A torch flame texture or glowing light sprite with blendFunc add will compound intensity on each frame, and if placed in a cluster or layered too heavily, it makes the area glow unnaturally, washing out underlying colours.
This trick is often used with particle effects, but a light glow could be simulated with rgbGen wave sin instead of layering multiple additive sprites.
Instead of additive blends blendFunc GL_ONE GL_ONE everywhere, designers often used modulate GL_DST_COLOR GL_ZERO or filtering blends that preserved detail.
Using screenshots from another article, this comparison shows the effectiveness of filter blends and how much detail is preserved. While this comparison doesn't show a blendFunc GL_ONE GL_ONE example, it clearly highlights a case of a blown out colour blend, with an alpha blend retaining more of the texture detail.
Colour Balance & Gamma
While not as common, blown-out colours can also come from mis-set gamma or colour correction. Higher gamma curves flatten mid-tones and make bright regions overshoot more easily. If your level is balanced for one gamma setting but players run at another, what looked 'bright but readable' in your editor may turn into 'white blobs' in game. Speaking from experience, be wary of messing with colour correction settings on a dev machine..
Core Shading Model Forumla
In Quake 3-style fixed pipeline lighting, the colour of a lit pixel is usually calculated as:
Cfinal = clamp( Ctexture × Llight × Iintensity, 0, 1 )Ctexture= base surface colour per channel (R,G,B in normalized range [0,1]).Llight= light colour per channel (R,G,B in normalized range [0,1]).Iintensity= scalar brightness multiplier from light entities or overbright bits.clampmeans values are forced to stay between 0 and 1 (since engines at the time didn't have HDR).
Channel Clamping
Blowout happens the moment any channel exceeds 1. After clamping, increasing intensity no longer increases that channel. White uses full strength in all channels simultaneously. When you raise intensity, all three channels hit 1 at the same time, the pixel becomes pure white earlier than coloured surfaces, which only clip one channel at a time.
