Skip to content
REAL-TIME · RAYMARCHED · ONE FRAGMENT SHADER

A black hole,
traced by hand.

No video. No model. Every frame, this page fires a photon through curved spacetime for each pixel on your screen — and lets gravity decide where it lands.

Fall in Drag to orbit the horizon
Mass
1.0M⊙ (sim)
rₛ
1.0units
Steps / px
150geodesic
Escape
calways
01 / THE PHOTON RING

Light that circled, then escaped.

That razor-thin ring of fire is light that looped the hole one or more times before flying to your eye. Nothing about it is a texture — it is the actual path of photons, bent by gravity, step by step on the GPU.

02 / THE ACCRETION DISK

A plane of plasma, folded over itself.

The disk is flat. You see it arcing above and below the hole because spacetime bends the light from its far side up and over the horizon. One side burns brighter — matter racing toward you is Doppler-beamed.

03 / GRAVITATIONAL LENSING

The sky, wrapped around a drain.

Every background star behind the hole is smeared into an Einstein ring. Drag to orbit and watch the whole starfield slide and warp as your line of sight threads the curved space around the mass.

04 / THE EVENT HORIZON

Where the math returns nothing.

Inside the horizon, every photon path ends at the singularity — so the center returns pure black. Keep scrolling and the camera falls inward; there is no coming back out.

HOW IT WORKS

Gravity, in a loop.

Per-pixel geodesics

Each fragment marches a photon and bends its velocity toward the singularity with an inverse-square pull every step.

The folded disk

Bent rays cross the equatorial plane two or three times, so a flat disk reads as a halo arcing over the hole.

Doppler beaming

Plasma rotating toward the camera is brightened; the approaching edge of the disk glows hotter and whiter.

Lensed starfield

The background is sampled by the photon's final direction, so stars smear into an Einstein ring around the shadow.

Blackbody color

Disk temperature drives a cool-to-hot ramp, tonemapped with an ACES filmic curve for that cinematic core.

Raw Three.js + R3F

A single fullscreen plane, one ShaderMaterial, no post-processing dependency. Honors reduced motion.

FULL FREEDOM. NO RESTRICTIONS.

This is the
ceiling.