# 3d retro graphics > 3d retro graphics is a free library of browser experiments. Each copies as a single HTML file (WebGL 1 or Canvas 2D) and is licensed CC0 1.0. Copy a demo, drop it on a page. Old workstation tricks, WebGL 1 or a 2D canvas. Licensed CC0. License: CC0 1.0. You can copy, modify, and ship the experiments commercially with no attribution. If WebGL is missing, a demo writes a message on the canvas. prefers-reduced-motion freezes the first still. ## How to fetch GET https://3d-retro.com/api/v1/experiments GET https://3d-retro.com/api/v1/experiments/{slug} (includes the full HTML string) GET https://3d-retro.com/examples/{slug}.html (standalone file) Accept: application/json on the API. CORS is open. ## Experiments ### 01 Plasma Era: Demoscene · 1992 Page: https://3d-retro.com/experiments/plasma Source: https://3d-retro.com/examples/plasma.html API: https://3d-retro.com/api/v1/experiments/plasma APIs: WebGL 1, GLSL ES 1.0, requestAnimationFrame, matchMedia Tags: shader, demoscene A demoscene plasma is a sum of sine fields in the plane, sampled through a cycling palette. This one is a single WebGL 1 fragment shader: two triangles, a time uniform, no textures. Drop the file on a page and it fills the window. Reduce motion and it holds a still frame. ### 02 Retro 3d starfield Era: Hyperspace · 1993 Page: https://3d-retro.com/experiments/starfield Source: https://3d-retro.com/examples/starfield.html API: https://3d-retro.com/api/v1/experiments/starfield APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: canvas, particles 700 points in a unit cube, projected with a 1/z divide. Depth is decremented each frame; when a star passes the camera it is recycled at the far plane. Motion blur is a cheap trail fade on the 2D canvas. Move the pointer to shift the vanishing point. Interaction: Move the pointer over the preview to shift the vanishing point. ### 03 Retro torus Era: GL workstation · 1993 Page: https://3d-retro.com/experiments/lowpoly Source: https://3d-retro.com/examples/lowpoly.html API: https://3d-retro.com/api/v1/experiments/lowpoly APIs: WebGL 1, GLSL ES 1.0, Pointer Events, requestAnimationFrame, matchMedia Tags: webgl, 3d A torus tessellated into chunky triangles with per-face normals, lit by a mint key and a cool fill. Edges are drawn as a second line pass. A ground grid locks it to the SGI demo-reel floor. Matrix math is inline, no three.js. Drag to orbit. It auto-rotates until you take over. Interaction: Drag on the preview to orbit. Auto-rotation stops after the first drag. ### 04 Chrome blobs Era: Metaballs · 1995 Page: https://3d-retro.com/experiments/metaballs Source: https://3d-retro.com/examples/metaballs.html API: https://3d-retro.com/api/v1/experiments/metaballs APIs: WebGL 1, GLSL ES 1.0, requestAnimationFrame, matchMedia Tags: shader, raymarch Three spheres blended with a polynomial smooth-min, raymarched in the fragment shader. Normals come from the gradient of the field. The material is a fake studio HDR: a horizon gradient plus two specular lights sampled along the reflected ray, with Fresnel mix. It is 1990s chrome, without a cubemap. ### 05 Reflective spheres Era: Whitted · 1980 Page: https://3d-retro.com/experiments/raytracer Source: https://3d-retro.com/examples/raytracer.html API: https://3d-retro.com/api/v1/experiments/raytracer APIs: WebGL 1, GLSL ES 1.0, requestAnimationFrame, matchMedia Tags: shader, raytrace Each pixel shoots a primary ray, intersects a plane and three spheres, then follows reflections for two extra bounces. Shadows are shadow rays toward a point light. The chrome ball is almost pure metal. The red and mint balls mix diffuse with a little reflection. The whole scene is one GLSL fragment shader. ### 06 ASCII torus Era: donut.c · 2006 Page: https://3d-retro.com/experiments/ascii Source: https://3d-retro.com/examples/ascii.html API: https://3d-retro.com/api/v1/experiments/ascii APIs: Canvas 2D, requestAnimationFrame, matchMedia Tags: ascii, canvas Andy Sloane's donut.c, drawn on a 2D canvas instead of stdout. Two nested angle loops sample a torus, project with a 1/z perspective divide, and keep a per-cell z-buffer. Lighting is a simple Lambert term mapped onto .:-=+*#%@. Phosphor green on charcoal. ### 07 Wireframe globe Era: IRIX · 1994 Page: https://3d-retro.com/experiments/globe Source: https://3d-retro.com/examples/globe.html API: https://3d-retro.com/api/v1/experiments/globe APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: wireframe, 3d A UV sphere as meridians and parallels, projected with a 1/z divide. Front edges are brighter than the far side, so the globe reads in depth without hidden-line removal. The equator and prime meridian are a touch hotter. Drag to orbit. It keeps a slow auto-spin until you take over. Interaction: Drag on the preview to spin the globe. Auto-rotation stops after the first drag. ### 08 Fluid tank Era: Stam · 1999 Page: https://3d-retro.com/experiments/fluid Source: https://3d-retro.com/examples/fluid.html API: https://3d-retro.com/api/v1/experiments/fluid APIs: Canvas 2D, ImageData, Pointer Events, requestAnimationFrame, matchMedia Tags: sim, fluid Jos Stam's stable fluids on a 48x48 grid: diffuse, project (Jacobi pressure), advect. Density is a phosphor dye; velocity is splatted along the pointer stroke. An ambient vortex keeps the tank moving when nobody is stirring. The solver is the textbook Game Developer Conference version. Interaction: Move or drag on the preview to stir the dye. A slow vortex keeps it in motion on its own. ### 09 Flow field Era: Vector field · 1996 Page: https://3d-retro.com/experiments/flow Source: https://3d-retro.com/examples/flow.html API: https://3d-retro.com/api/v1/experiments/flow APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: particles, field Each particle integrates a procedural vector field: sines for the ambient flow, plus a moving singularity that acts as a slow cyclone. The pointer adds a second vortex wherever it sits. Trails are a cheap canvas fade. Interaction: Move the pointer over the preview to twist the field into a vortex. ### 10 Verlet fabric Era: Jakobsen · 2001 Page: https://3d-retro.com/experiments/fabric Source: https://3d-retro.com/examples/fabric.html API: https://3d-retro.com/api/v1/experiments/fabric APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: sim, cloth Thomas Jakobsen's Verlet cloth: a grid of points, distance constraints, gravity. Two corners are pinned. A slow sine is the wind. Drag any point and the rest of the mesh follows. Interaction: Drag a point on the cloth to tug it. ### 11 Wireframe terrain Era: Vector CRT · 1979 Page: https://3d-retro.com/experiments/terrain Source: https://3d-retro.com/examples/terrain.html API: https://3d-retro.com/api/v1/experiments/terrain APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: wireframe, 3d A height field of summed sines, projected with a 1/z divide, stroked as a mesh that recedes into phosphor fog. The camera flies forward. Move the pointer to yaw. This is the Battlezone / Evans & Sutherland look: no textures, no hidden-line removal, just a wire landscape on a CRT. Interaction: Move the pointer left or right to steer. ### 12 Wolfenstein raycaster Era: id Software · 1991 Page: https://3d-retro.com/experiments/wolfenstein Source: https://3d-retro.com/examples/wolfenstein.html API: https://3d-retro.com/api/v1/experiments/wolfenstein APIs: Canvas 2D, Keyboard Events, Pointer Events, requestAnimationFrame, matchMedia Tags: raycast, 3d Wolfenstein 3D's 2.5D engine: for each column, a ray steps a grid with DDA until it hits a wall, then a vertical strip is drawn at 1/distance. No polygons. Ceiling and floor are flats. A tiny map sits in the corner. It patrols the maze until you take over. Interaction: WASD or arrows to walk. Move the pointer to look. A/D strafe. ### 13 Voxel Space Era: Comanche · 1992 Page: https://3d-retro.com/experiments/voxel Source: https://3d-retro.com/examples/voxel.html API: https://3d-retro.com/api/v1/experiments/voxel APIs: Canvas 2D, ImageData, Pointer Events, requestAnimationFrame, matchMedia Tags: voxel, 3d NovaLogic's Voxel Space: each screen column walks a height map, drawing a vertical strip whenever the terrain rises above what is already filled. Color comes from height and a cheap slope light. No polygons. The camera flies forward. Move the pointer to yaw. Interaction: Move the pointer left or right to steer. ### 14 Mode 7 floor Era: SNES · 1990 Page: https://3d-retro.com/experiments/mode7 Source: https://3d-retro.com/examples/mode7.html API: https://3d-retro.com/api/v1/experiments/mode7 APIs: Canvas 2D, ImageData, Pointer Events, requestAnimationFrame, matchMedia Tags: mode7, 3d For each scanline below the horizon, a distance is recovered from camera height and the line is a slice of a 2D texture. That is Mode 7 / Space Harrier: no mesh, just a perspective divide on Y. A few pylons are billboards. Move the pointer to yaw. Interaction: Move the pointer left or right to steer. ### 15 PS1 affine warp Era: PlayStation · 1995 Page: https://3d-retro.com/experiments/ps1 Source: https://3d-retro.com/examples/ps1.html API: https://3d-retro.com/api/v1/experiments/ps1 APIs: Canvas 2D, ImageData, Pointer Events, requestAnimationFrame, matchMedia Tags: raster, 3d The PlayStation interpolated texture coordinates in screen space, not 1/z. Large triangles then swim. This rasterizer does the same, and snaps vertices to integer pixels the way the GTE did. Drag to orbit. Auto-rotation stops after the first drag. Interaction: Drag on the preview to orbit. Auto-rotation stops after the first drag. ### 16 I, Robot polygons Era: Atari · 1984 Page: https://3d-retro.com/experiments/irobot Source: https://3d-retro.com/examples/irobot.html API: https://3d-retro.com/api/v1/experiments/irobot APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: polygon, 3d I, Robot was the first arcade game to fill polygons in real time. Faces are sorted back-to-front and painted. No z-buffer, no textures: a grid of platforms, a red tower, primary colors on black. Drag to orbit. It keeps a slow auto-spin until you take over. Interaction: Drag on the preview to orbit. Auto-rotation stops after the first drag. ### 17 Utah teapot Era: Newell · 1975 Page: https://3d-retro.com/experiments/teapot Source: https://3d-retro.com/examples/teapot.html API: https://3d-retro.com/api/v1/experiments/teapot APIs: WebGL 1, GLSL ES 1.0, Pointer Events, requestAnimationFrame, matchMedia Tags: webgl, 3d Martin Newell's teapot, lathed and swept rather than the original 32 patches, Gouraud/Phong shaded. Two point lights sit in the scene as little orbs. Move the pointer: the key light follows, the fill stays opposite. Ceramic, lamp, and fill colors are on the tweak row. Interaction: Move the pointer to drag the two lights around the teapot. ### 18 Dot/square tunnel Era: Demoscene · 1991 Page: https://3d-retro.com/experiments/tunnel Source: https://3d-retro.com/examples/tunnel.html API: https://3d-retro.com/api/v1/experiments/tunnel APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: demoscene, 3d Rings recede along Z. Each ring is a square outlined with dots, corners drawn as squares. A 1/z divide is the tunnel. Twist is a spin that grows with depth. Move the pointer to drag the vanishing point. Interaction: Move the pointer to shift the vanishing point. ### 19 Palette fire Era: Demoscene · 1993 Page: https://3d-retro.com/experiments/fire Source: https://3d-retro.com/examples/fire.html API: https://3d-retro.com/api/v1/experiments/fire APIs: Canvas 2D, ImageData, Pointer Events, requestAnimationFrame, matchMedia Tags: demoscene, palette The 90s fire: a low-res buffer, each pixel is the average of the three below it minus a cooling term, then a palette from black through the tweak color into yellow and white. The bottom row is random sparks. Move the pointer to poke the fire. Interaction: Move the pointer over the preview to feed the fire. ### 20 XY oscilloscope Era: Vector CRT · 1970s Page: https://3d-retro.com/experiments/scope Source: https://3d-retro.com/examples/scope.html API: https://3d-retro.com/api/v1/experiments/scope APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: vector, crt X is one sine, Y is another. That is the XY mode on a scope, and the picture is a Lissajous curve. Persistence is a cheap canvas fade. Move the pointer to detune the Y frequency. Ratio is the second harmonic. Interaction: Move the pointer left or right to change the frequency ratio. ### 21 Boing ball Era: Amiga · 1984 Page: https://3d-retro.com/experiments/boing Source: https://3d-retro.com/examples/boing.html API: https://3d-retro.com/api/v1/experiments/boing APIs: Canvas 2D, ImageData, Pointer Events, requestAnimationFrame, matchMedia Tags: amiga, 3d Commodore's 1984 show ball: a sphere with longitude/latitude checkers, Lambert-shaded, a flattened shadow on a perspective grid. It bounces with a little energy loss and rolls with its spin. Click to kick it. Interaction: Click the preview to kick the ball. ### 22 Slit-scan stargate Era: Trumbull · 1968 Page: https://3d-retro.com/experiments/stargate Source: https://3d-retro.com/examples/stargate.html API: https://3d-retro.com/api/v1/experiments/stargate APIs: Canvas 2D, ImageData, Pointer Events, requestAnimationFrame, matchMedia Tags: optical, 3d Douglas Trumbull's slit-scan: a one-dimensional strip of artwork is sampled while the camera dollies, so each pixel is a different moment. Here the slit is polar. Color streaks recede into a vanishing point. Move the pointer to shove the corridor. Interaction: Move the pointer to shift the vanishing point. ### 23 Rutt-Etra scan Era: Rutt/Etra · 1973 Page: https://3d-retro.com/experiments/ruttetra Source: https://3d-retro.com/examples/ruttetra.html API: https://3d-retro.com/api/v1/experiments/ruttetra APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: video, 3d The Rutt-Etra scan processor took a video signal and bent each scanline in Z by brightness. This one synthesizes a cheap 'video' of blobs and rings, then draws it as a wire mesh. Drag to orbit. It keeps a slow auto-spin until you take over. Interaction: Drag on the preview to orbit. Auto-rotation stops after the first drag. ### 24 Glenz vectors Era: Amiga · 1990 Page: https://3d-retro.com/experiments/glenz Source: https://3d-retro.com/examples/glenz.html API: https://3d-retro.com/api/v1/experiments/glenz APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: demoscene, 3d Glenz vectors are the Amiga demo trick of drawing a solid with see-through faces so the back sides pile up as light. An icosahedron, painter-sorted, additive blend. Magenta against cyan unless you change it. Drag to orbit. Interaction: Drag on the preview to orbit. Auto-rotation stops after the first drag. ### 25 Hopalong attractor Era: Martin · 1986 Page: https://3d-retro.com/experiments/hopalong Source: https://3d-retro.com/examples/hopalong.html API: https://3d-retro.com/api/v1/experiments/hopalong APIs: Canvas 2D, ImageData, Pointer Events, requestAnimationFrame, matchMedia Tags: attractor, plotter Barry Martin's hopalong: x' = y − sign(x)·√|bx − c|, y' = a − x. Plot the orbit and a shape appears. Move the pointer to detune a. Color is additive phosphor. Interaction: Move the pointer left or right to change the constant a. ### 26 Penrose tiling Era: Penrose · 1974 Page: https://3d-retro.com/experiments/penrose Source: https://3d-retro.com/examples/penrose.html API: https://3d-retro.com/api/v1/experiments/penrose APIs: Canvas 2D, Pointer Events, requestAnimationFrame Tags: tiling, geometry A pentagon of acute golden triangles, subdivided by Robinson's rule. Two rhombs, no period. Fat and thin take the two tweak colors. Drag to pan. Depth rebuilds the mesh. Interaction: Drag on the preview to pan. ### 27 Elite planet Era: Braben · 1984 Page: https://3d-retro.com/experiments/elite Source: https://3d-retro.com/examples/elite.html API: https://3d-retro.com/api/v1/experiments/elite APIs: Canvas 2D, Pointer Events, requestAnimationFrame, matchMedia Tags: wireframe, 3d Elite's worlds were spheres of dots with the back culled, a Lambert term for the terminator, and a cheap ring. No textures. Drag to spin. It keeps a slow auto-rotate until you take over. Interaction: Drag on the preview to spin the planet. Auto-rotation stops after the first drag. ### 28 Spaghetti vortex Era: Scientific visualization · 2026 Page: https://3d-retro.com/experiments/vortex Source: https://3d-retro.com/examples/vortex.html API: https://3d-retro.com/api/v1/experiments/vortex APIs: WebGL 1, GLSL ES 1.0, Pointer Events, requestAnimationFrame, matchMedia Tags: webgl, 3d, particles Parametric helices scaled by the 2026 OpenAI paper's leading laws: radius follows tau^(1/2), height tau^(1/2−h), with illustrative h = 0.005 and tau = 1−t/T*. Both shrink; radius shrinks faster. Drag to orbit, scrub toward T*, or follow the core with a labeled uniform zoom. Color shows normalized radius. Oscillatory corrections are omitted. Illustration of the proposed blowup construction; not a numerical reproduction of the proof. Interaction: Drag to orbit; auto-rotation stops after the first drag. Play, pause, scrub the approach, or follow the core.