Quick answer: Pre-darken your source surface. Multiply its RGB by ~0.2–0.4 before the additive blit. Or use BLEND_PREMULTIPLIED with surfaces authored in premultiplied format.

Three glow sprites overlap a torchlight. Result: pure white blob instead of a warm gradient. BLEND_RGB_ADD clamps at 255 and accumulates fast.

The Symptom

Additive blits brighten correctly with a single sprite but white-out when stacked. Bright color information is lost.

The Fix

import pygame

# Source glow surface (orange, full intensity)
glow = pygame.image.load("glow.png").convert_alpha()

# Pre-darken to 30% so multiple stack cleanly
glow_dim = glow.copy()
glow_dim.fill((76, 76, 76, 255), special_flags=pygame.BLEND_RGB_MULT)

# Each blit adds ~30% of full glow
for pos in torch_positions:
    screen.blit(glow_dim, pos, special_flags=pygame.BLEND_RGB_ADD)

The pre-multiply scales every pixel. Stacking three darkened glows reaches ~90% of full white — nice gradient instead of saturation.

Author Pre-Multiplied

For HDR-like glows authored in art:

  1. Save glow.png as premultiplied alpha (multiply RGB by alpha at export).
  2. Load with convert_alpha.
  3. Blit with special_flags=pygame.BLEND_PREMULTIPLIED.

Result is gamma-correct additive without per-frame darkening.

Verifying

Stack 5+ glows. Should produce a smooth bright spot without flat-white. Compare side-by-side with un-darkened additive: difference is dramatic.

“Pre-darken sources. Premultiplied for clean. Stacks blend.”

Related Issues

For sprite group order, see draw order. For text antialias, see text edges.

Darken first. Add after. No saturation.