Bright-region bloom
How intense target regions spread into neighbouring samples, producing a soft halo that grows with highlight level.
Visible effect
Highlights spread farther than ordinary target detail
Bright objects acquire a soft surrounding halo while ordinary detail remains comparatively sharp. The spread is intensity dependent: it becomes visible only after the local blurred response crosses a highlight threshold.
This is not the same as uniform target softness. Bloom adds a level-dependent region around highlights, whereas softness reduces spatial detail everywhere.
Physics
Strong local response couples into neighbouring target positions
Finite beam diameter, target charge behaviour, and overloaded readout can broaden a strong bright-region response. The exact cause and appearance depend on the tube and its operating point.
Only signal above a threshold enters a circular target-plane spread. Dark image values never enter that kernel, so a dark silhouette cannot leak outward as a false shadow.
Mathematics
Only extracted highlight energy enters the disk
The thresholded signal H contains bright-region energy only. Normalized circular kernel K spreads it into neighbours, and amount A adds the resulting halo to the unblurred source.
Shader
Bright-only additive disk gather
Thirty-two golden-angle taps sample a circular footprint. Each tap is thresholded before accumulation, normalized, scaled, and added to the clean image.
// WHAT: Spread energy from very bright target regions into nearby pixels.
// HOW: Keep only samples above a luminance threshold, gather them over a
// weighted disk, then add the gathered highlight energy to the clean image.
// WHY: Vidicon highlight blooming is driven by strong stored target charge;
// blurring the complete image would incorrectly spread dark detail as well.
// sampler2D is the source image. uv is its normalized [0, 1] coordinate.
// texel is the UV size of one source pixel, so radiusPx remains pixel-based.
const int TARGET_BLOOM_SAMPLES = 32;
const float BLOOM_GOLDEN_ANGLE = 2.39996323;
vec3 extractHighlight(vec3 colour, float threshold) {
float luminance = dot(colour, vec3(0.299, 0.587, 0.114));
// smoothstep fades the contribution in around the threshold instead of
// creating a hard contour around every bright object.
float highlightWeight = smoothstep(threshold, 1.0, luminance);
return colour * highlightWeight;
}
vec3 brightRegionBloom(
sampler2D source,
vec2 uv,
vec2 texel,
float radiusPx,
float threshold,
float amount
) {
vec3 clean = texture(source, uv).rgb;
vec3 gatheredHighlights = vec3(0.0);
float weightSum = 0.0;
// The golden-angle spiral covers a disk without obvious horizontal rings.
// sqrt(fraction) gives approximately equal sample density per unit area.
for (int index = 0; index < TARGET_BLOOM_SAMPLES; index += 1) {
float fraction = (float(index) + 0.5) / float(TARGET_BLOOM_SAMPLES);
float sampleRadius = sqrt(fraction);
float sampleAngle = float(index) * BLOOM_GOLDEN_ANGLE;
vec2 diskPosition = vec2(cos(sampleAngle), sin(sampleAngle)) * sampleRadius;
float sampleWeight = exp(-2.0 * fraction); // centre contributes most
vec2 sampleUv = uv + diskPosition * texel * radiusPx;
vec3 sampleHighlight = extractHighlight(
texture(source, sampleUv).rgb,
threshold
);
gatheredHighlights += sampleHighlight * sampleWeight;
weightSum += sampleWeight;
}
vec3 halo = gatheredHighlights / max(weightSum, 0.0001);
return min(clean + halo * clamp(amount, 0.0, 1.0), vec3(1.0));
}- Source texturesRGB
- Thresholded neighbourhood gatherOne fullscreen render pass
- Extract highlight energy from each sample
- Gather the bright-only neighbourhood
- Scale the spread response
- Add the halo to the source
- Display output
Why these steps are here
- Distribute taps over equal-area annuli so the support is circular rather than box-shaped.
- Extract highlight energy independently at every tap.
- Normalize the bright-only neighbourhood before applying bloom amount.
- Add the halo to the unblurred source instead of replacing the source with a blur.
- Clamp only at the output boundary.
Notes
- The one-pass 32-tap disk is bounded for an interactive article; a wide production bloom may use a pyramid or calibrated distributed model.
- This model does not simulate a complete target RC network or beam-current limiter.
- Optical flare and film halation can create similar halos at earlier stages.
References
US3883769A — Vidicon target patent — describes target charge storage, dark current, electron-beam readout, and bright-source blooming.
RCA Review, September 1954 — television pickup tubes — primary camera-tube research covering aperture response, lag, flare, transfer response, scanning, and shading.