The whole algorithm, running

Progressive path tracer

This is the rendering equation being solved by Monte Carlo integration, in your browser, one sample per pixel per frame. The image starts as noise and converges while you watch — that convergence is the entire subject of this section, and no still image can show it. Switch between direct illumination and full global illumination and watch colour bleed onto the white walls.

The render
Accumulating…

Light transport what gets simulated
4
0.34
1.15
Convergence noise against samples

The dashed line is 1/√N. Monte Carlo error follows it: to halve the noise you need four times the samples, which is why the last few percent of quality costs more than everything before it.

Samples per pixel
0
Rays traced
0
Estimated noise
Samples for half this noise
What you are looking at the scene

A closed box with a small emitting rectangle in the ceiling. The left wall is red, the right green, everything else white — the classic test scene, because the coloured walls make indirect light impossible to miss.

In direct only mode each camera ray finds a surface, fires one shadow ray at the light, and stops. Anything the light cannot see is pure black, because nothing else can reach it. That is the simplification described in the notes: fast, easy, and wrong.

In full global illumination the ray keeps going after the shadow ray, bouncing off whatever it hit and gathering light from the rest of the room. Red creeps onto the left of the white sphere, green onto its right, and the shadows fill in — none of that is a light source, it is the walls acting as one.

The loop being run, per pixel live

    
Why this is noisy and rasterisation is not. A rasteriser answers "what colour is this pixel" with a formula. A path tracer answers it with an estimate: it takes a random sample of the infinitely many paths that could have delivered light here, and averages them. Any single sample is wildly wrong; the average of enough of them is right. Every grain of noise you can see is the gap between the samples taken so far and the true integral — which is why letting it run is not a workaround, it is the algorithm.