home/ atoms/ motion-blur-temporal-supersampling

Motion blur is achieved by rendering multiple frames at sub-frame time offsets and averaging the results

Cinematic motion blur arises because film is exposed for a fraction of each frame duration (shutter angle). To fake this in a shader: render the entire scene N times (typically 4) with time offsets spaced across half a frame duration (1/24s × 0.5 = shutter open time), accumulate the colors, divide by N. This is brute-force temporal super-sampling. The same pass also provides spatial anti-aliasing by jittering the pixel’s sub-pixel sample position. Dithering with blue noise removes the visible discrete steps (ghosting bands) at low N, exploiting temporal integration by the eye at animation frame rate.

Examples

vec3 tot=vec3(0); for(int aa=0;aa<4;aa++){ float t=iTime+(float(aa)/4.0)*(0.5/24.0); tot+=render(uv, t); } tot/=4.0;

Assessment

A shader runs at 60 FPS with 4× temporal supersampling. Calculate how far a fast-moving object (1 unit/s) travels during the motion blur integration window.

“render this thing four times, at least, let's try that, make sure that I'm streaming, I am streaming. Okay, everything's dependent of time”
corpus · inigo-quilez-live-coding-happy-jumping-video · chunk 30