Stoatworks Labs

Afterglow

Frame trails that decay as they age, for Resolume

Releasedv0.1.3Plugin & ModuleC++ / GLSL
Afterglow — Frame trails that decay as they age, for Resolume
Afterglow

What it does

An echo effect is usually a feedback loop: the output is fed back into the input, and what you see is the picture compounded with itself over and over. It is cheap, it is easy, and it is why most trails smear into mud — every frame carries the whole history of every frame before it, so nothing in the trail is a picture any more.

This is a queue instead. The last four to thirty-two frames are kept as themselves, and all of them are laid back over the picture at once, each one weighted by its age. Nothing is ever fed back, so a ghost eight frames old is still that frame — recognisably a picture, not an average of everything since. That is the reason the trail reads as discrete ghosts rather than a smear, and it is the whole architectural decision.

The decay is where the character comes from, and it is not just a fade. Every control describes what has happened to a frame by the time it reaches the end of the queue — the bit depth collapsed, the grid coarsened, a noise field pulling it apart, the colour walked round the wheel, the frame drifted, zoomed and spun away — and each ghost gets that much of it in proportion to its own age. So the trail is not the picture getting dimmer. It is the picture falling apart, in whatever way you choose, at whatever rate.

One property holds all of it up: a picture that is not moving must come out of the effect exactly as it went in, byte for byte. Every frame in the queue is then identical, the weights sum to one, and the result is the input. That invariant is asserted by the build rather than hoped for, and it is what stops the effect quietly lifting or darkening a static frame.

  • A queue of 4 to 32 real frames, with Hold spreading a dozen ghosts across two seconds, and Decay shaping how the weight falls away along the trail
  • Four ways to combine the queue — a weighted average, added, screened, or the brightest of them — each with its own weight schedule, because a sum and a composite do not take the same alphas
  • Ageing that is more than a fade: Crush collapses 8 bits down to 1, Pixelate coarsens to six cells across the frame, Warp pulls the picture apart with a boiling noise field, and Drift, Zoom, Spin and Hue Shift carry the ghost away
  • Halation with its own size and tint, and Bleach, for the bloom around a bright trail
  • A still picture comes out untouched, byte for byte — asserted by the build, with Screen the one documented exception, which may lift but never darken
  • Ships for Resolume on macOS and Windows, and for Resolve, Nuke, Natron and Vegas on macOS, Windows and Linux

Where it stands

Released at v0.1.2; the point release changed nothing but the Windows installer, which no longer touches the system PATH — the earlier one could overwrite it. The decay model is verified numerically rather than by eye: an offline harness drives the real plugin class in a headless GL context and runs the shipped GLSL against an independent C++ implementation of the same maths, 365,696 comparisons with zero disagreements, and separately proves the still-picture invariant byte for byte. All 23 controls measurably change the picture, every factory preset survives every host behaviour, and the browser demo is checked to be running the plugin's own shader rather than a lookalike. Cost is 0.66 ms/frame at 1080p and 2.6 ms at 4K. It has never been loaded into Resolume or Resolve — it has been compiled, rendered and measured offline, which is a different claim. Check it in your own rig before trusting it in a show.