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

A strong target response spreads into neighbouring readout positionsSTORED TARGET CHARGEBRIGHT-ONLY RESPONSENEIGHBOURING LOCATIONS CHARGE UP
A strongly charged target area broadens into adjacent readout positions instead of carrying dark image values outward.

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.

brightRegionBloomGLSL
// 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));
}
Processing pipelineBoxes mark actual render-pass boundaries.
  1. Source texturesRGB
  2. 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
  3. Display output

Why these steps are here

  1. Distribute taps over equal-area annuli so the support is circular rather than box-shaped.
  2. Extract highlight energy independently at every tap.
  3. Normalize the bright-only neighbourhood before applying bloom amount.
  4. Add the halo to the unblurred source instead of replacing the source with a blur.
  5. 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.