Lab, the field and 04 systems, WebGL2, three.js and RXXR

Things built to find out.

Systems that make imagery from rules. Agentic workflows in three.js, GLSL and whatever else the job needs, so a still can become a loop, a loop can become a launch, and none of it has to be redrawn. The field at the top is live.

The particle field, half a million particles in a loose sweep

Field

Built for Dialog RSN-1, 2026. Live.

The particle field

Half a million particles simulated on the GPU, in the browser, right now. This is the engine behind the Dialog RSN-1 launch imagery: the model frames, the film inserts and the ads were all rendered out of it, and the glyph systems below are its other output. It is voice native. Plugged into a WebRTC socket it moves with a live conversation, so a customer can talk to PolyAI's frontier voice AI in their browser and watch the field listen and answer. Here it runs without a microphone. Drag to orbit it. Click it to change its state and watch the same particles gather into the listening orb on a stand-in signal.

How it works

  1. 01

    Every particle lives on the GPU. Its position and velocity sit in textures and a shader moves it each frame, so the browser can hold 524,288 of them at once without the CPU touching a single one.

  2. 02

    Each particle has a seeded identity and a home. In the open field they travel together on slow crossing currents. In the listening state the same particles gather into a loose orb with a thick, irregular edge. Nothing respawns between states.

  3. 03

    Voice drives it. The audio of a conversation, from the microphone or from the WebRTC stream, is split into level, low, mid, high and transient bands. A set of invisible nodes turns those bands into charge, focus and circulation in the particles. Charge spreads and fades over seconds, so a pause leaves a trace and the field carries the last few seconds of speech. The renderer never knows which speech model is on the other end, which is what lets it sit in front of a live agent.

  4. 04

    A click changes the state and lights the particles at the point you hit. The light travels outward through twelve invisible regions, bends the motion as it passes and leaves a charge that fades over a few seconds.

  5. 05

    The camera drifts on its own and turns with inertia when you drag. The particle count is chosen from the device, the render runs at native pixel density up to two times, and it stops drawing when it leaves the screen.

  1. 01 / 04

    Field

    A field of glyphs. Characters stand in for pixels, so the image reads as type from a distance and as noise up close.

    1256 × 704, 25 fps, 7.8 s

  2. 02 / 04

    Terrain

    A strip of terrain drawn in glyphs, scrolling under a fixed frame. The character set thins where the slope falls away.

    1256 × 704, 25 fps, 7.8 s

  3. 03 / 04

    Orb

    A sphere of particles rendered as characters, turning. The glyph in each cell follows how much light lands on it.

    1256 × 704, 25 fps, 12 s

  4. 04 / 04

    Cloud

    A volume of particles with no hard edge. Same renderer as the orb with the surface removed, so the form is only ever density.

    1256 × 704, 25 fps, 9.2 s

  • Signal Lab

    A raster-to-glyph tool that turns any image or frame into a dithered signal field. The precursor to the shader above, built for a client site.

    Client tool, gated

  • Ad and campaign generators

    Browser tools that produce on-brand display ads, gradient slides and kinetic type from copy alone. Colour, motion and layout are locked; the copy is the only input.

    Client tools, in use

  • Audio-reactive particle systems

    TouchDesigner and WebGL experiments where speech drives a particle volume.

    In progress

  • The studio

    The hero of this site. A modelled room drawn in the browser, with an opening that builds it edge by edge, then surface by surface.

    Live