A black hole, ray traced in real time
Nothing on this page is a texture or a pre-rendered animation. Every pixel is a ray of light traced backwards through the curved spacetime around a Schwarzschild black hole, until it either falls through the event horizon, strikes the accretion disk, or escapes to the stars behind it.
What you are looking at
- The shadow. The black disc is roughly 2.6 Schwarzschild radii across — noticeably larger than the event horizon itself, because light passing nearby is bent into the hole and never reaches you.
- The ring arcing over the top. That is the far side of the disk. Light leaving the gas behind the black hole is bent up and over toward your eye, so a perfectly flat disk appears folded upward. The arc underneath is the same effect seen from below.
- The thin bright circle. The photon ring: light that orbited the black hole one or more times before escaping in your direction.
- The brighter side. Gas approaching you is Doppler boosted and blue shifted, while the receding side dims and reddens. The famous Interstellar frame left this effect out, which is why that image looks symmetric.
How it works
Null geodesics are integrated in Cartesian coordinates using each ray's conserved
angular momentum h = |x × v|, giving
d²x/dλ² = -1.5 · rₛ · h² · x / r⁵.
The step length is proportional to the distance from the horizon, so the path is
resolved finely where spacetime bends hard and strides forward where it is flat.
The accretion disk is a plane at the equator, and every crossing is solved for exactly, which is what makes the multiple lensed images appear on their own. Each crossing is shaded as an emitting and absorbing slab with relativistic Doppler and gravitational redshift, then the gas is sheared at Keplerian speed (ω ∝ r-3/2) so the turbulence winds into trailing filaments.
Controls
Drag to orbit, right-drag to pan, scroll or pinch to zoom, double-click to zoom in.
The compass resets your bearing and the slider beside the zoom buttons controls tilt,
from edge-on to straight down. Press H to hide the interface and
P to save a PNG.
© 2026 @abbosby. All rights reserved. Built with WebGL2.