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:
- Save glow.png as premultiplied alpha (multiply RGB by alpha at export).
- Load with convert_alpha.
- 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.