clicktorelease

Home

Create

Bumpy Metaballs 2026

A rebuild of the 2013 original on WebGL2: the isosurface is polygonised on the GPU, normal-mapped without UVs and lit by an environment map, from wet flesh to glass refracting an inner core.

  • Experiment
  • Isosurfaces
  • GPGPU
  • Image-based lighting
  • WebGL 2
  • three.js

Create

Three.js Conf

A physics toy for THREE.JS CONF 2026: lushly shaded procedurally generated text based on SDFs, thrown around by Ammo.js physics and sound effects produced with Web Audio API.

  • Web toy
  • Physics
  • SDF
  • Web Audio
  • WebGL
  • three.js

Create

Flat Earth

A world map on an oblique cylindrical projection: centre it anywhere on Earth and that is the point the map gets right. Shaded relief and soft shadows over satellite imagery.

  • Experiment
  • Maps
  • three.js
  • WebGL 2

Create

Guspira

A small reactive GUI toolkit for creative-coding sketches: every slider, tab and preset binds to a signal, so the control and the value never drift apart. No dependencies.

  • Library
  • Dev tools
  • JavaScript

Create

CCapture.js 2

A ground-up rewrite of CCapture.js: capture canvas animations at a fixed framerate, however long each frame takes to draw, and encode them to MP4 or WebM with WebCodecs. GPU motion blur and frame-accurate audio.

  • Library
  • Video capture
  • Web Audio
  • JavaScript
  • Canvas 2D

Create

Inktober 2025

Thirty-one ink sketches of strange attractors and flow fields, drawn as shaded, self-shadowed MeshLine strokes.

  • Series
  • Strange attractors
  • Flow fields
  • Lines
  • NPR
  • WebGL
  • three.js

Create

Codevember 2022

A month of shaders and post-processing for Codevember 2022, built with WebGL and three.js.

  • Series
  • GPGPU
  • Volume rendering
  • Post-processing
  • WebGL
  • three.js
  • GLSL

Create

Halloween 2022

Double Halloween feature to give some ambience to this spooky season: Pumpkin Sphere, a mass of pumpkins hovering around you; and Spooky Cloud, a particle-driven cloud of pumpkins and skulls chasing a wisp.

  • Experience
  • Particles
  • Physics
  • GPGPU
  • WebGL
  • three.js

Create

Floating Shiny Knot

A remake of the 2012 experiment in image-based lighting from Google Street View panoramas, now fetched with PanomNom.js, with better shading and normal mapping that perturbs the surface and its reflections and refractions.

  • Experiment
  • Image-based lighting
  • Panoramas
  • WebGL
  • three.js

SpeakWebGL+WebGPU Meetup, Online

WebGL+WebGPU Meetup

Creative coding in the land of WebGL2: how to get started with creative coding in the browser.

  • Talk
  • Generative
  • WebGL 2

Create

Genuary 2022

Thirty-one days of procedural generation for Genuary 2022, with three.js and WebGL.

  • Series
  • Generative
  • Noise
  • Post-processing
  • WebGL
  • three.js

Create

Codevember 2021

One experiment a day for Codevember 2021: simulations, post-processing and more with WebGL and three.js.

  • Series
  • GPGPU
  • Particles
  • Volume rendering
  • Post-processing
  • WebGL
  • three.js

Create

Web Unleashed 2021 Opening Titles

Opening titles for FITC Web Unleashed 2021: strange attractors grown into tube geometries, rendered in near real-time WebGL and captured to video.

  • Client work
  • Strange attractors
  • Ambient occlusion
  • Post-processing
  • Video capture
  • WebGL
  • three.js

Create

Inktober 2021 Strange Attractor Sketches

Thirty strange attractors for Inktober 2021, drawn with the NPR hatching techniques from the 2020 sketches.

  • Series
  • Strange attractors
  • NPR
  • WebGL
  • three.js

Create

Lines on a Sphere

A refresh of Lines on a Sphere from Codevember 2016: thousands of particles tracing lines over a flow field wrapped on a sphere.

  • Experiment
  • Flow fields
  • Particles
  • GPGPU
  • WebGL
  • three.js

Create

Dual Boids

A flock of spheres following classic boids rules, shaded with analytic sphere ambient occlusion based on IQ's article.

  • Experiment
  • Simulation
  • Ambient occlusion
  • WebGL
  • three.js
  • GLSL

Create

Generative art: Lines on flow fields

MeshLine strokes tracing the field lines between electrical charges. Interactive, but made for the still images it produces.

  • Experiment
  • Generative
  • Flow fields
  • Lines
  • WebGL
  • three.js

Create

F*MMXX

An angsty new year demo to send off 2020, the year of Covid: a maneki-neko trying to beckon better fortune, lots of light effects and a lot of messages. 3D art by acidbeat, music by gloom.

  • Demo
  • Post-processing
  • three.js
  • WebGL 2

Create

Generative baubles

An editor for procedural Christmas baubles: tweak the shape, materials and stripes from a panel and make your own.

  • Experience
  • Procedural modelling
  • Generative
  • WebGL
  • three.js

SpeakGitHub Universe, Online

The future of the web in an XR world

A look back at the web and VR, and ahead at the technology, browsers and APIs of an XR-enabled web.

  • Talk
  • WebVR

Create

SDF physics

An experiment with GPU particles bouncing off volumes defined with SDFs.

  • Experiment
  • SDF
  • Physics
  • Particles
  • GPGPU
  • WebGL
  • three.js

Create

Inktober 2020 Sketch experiments

Thirty-five sketches for Inktober 2020, all NPR post-processing: hatching, cross-hatching, lines and other ink techniques. No prompts, just experimentation.

  • Series
  • NPR
  • Post-processing
  • WebGL
  • three.js
  • GLSL

Create

Shield VFX

A translucent energy shield: a glassy bubble patterned with Worley noise, with a glowing rim where it intersects the scene, read from the depth buffer.

  • Experiment
  • Noise
  • three.js
  • WebGL 2

Create

Voxel Volume Rendering

Raymarching a 3D Perlin noise isosurface on the GPU, with an option to accumulate values along the ray for non-solid, cloudy volumes. It became the basis for the official three.js volume renderer.

  • Experiment
  • Volume rendering
  • Noise
  • three.js
  • WebGL 2

Create

Obsolidian

Demo for Solskogen 2020 in collaboration with mrdoob, ranked 3rd: a shape evolves through the platonic solids, from tetrahedron to sphere, down a tunnel of lights. Music by gloom.

  • Demo
  • SDF
  • WebGL
  • three.js
  • GLSL

Create

FaceMeshFaceGeometry

A three.js geometry that follows the face tracked by FaceMesh, with UVs to texture it from the video feed and anchor points to attach 3D objects to the face.

  • Library
  • WebGL
  • three.js
  • Webcam & mic

Create

Loops 2018-2019

Around 350 loops made in 2018 and 2019 with looper, a framework for generating loops with three.js.

  • Series
  • Loops
  • Generative
  • Lines
  • WebGL
  • three.js

Create

Digital Inktober 2019

A loop a day for Inktober 2019, made with looper and MeshLine: more complex than the year before, some of them built on strange attractors.

  • Series
  • Loops
  • Lines
  • Strange attractors
  • WebGL
  • three.js

Create

Capture the Flag viewer

A stylised 3D viewer for DeepMind's Capture the Flag research: matches in procedurally generated indoor and outdoor environments, where agents train and learn to interact and cooperate.

  • Client work
  • WebGL
  • three.js
  • GLSL

Create

Infinite Gift

Gift boxes that lift their lids to reveal another box, which opens to reveal another, in an infinite loop. Boxes and wrapping paper are procedurally generated. Christmas Experiments 2018.

  • Experience
  • Procedural modelling
  • Post-processing
  • WebGL
  • three.js
  • GLSL

Create

Codevember 2018

A month of loops for Codevember 2018, one a day on that day's theme, made with looper.

  • Series
  • Loops
  • Generative
  • WebGL
  • three.js

Create

Digital Inktober 2018

Thirty-one loops for Inktober 2018, one a day, made with looper and drawn with MeshLine.

  • Series
  • Loops
  • Lines
  • WebGL
  • three.js

Create

Explore With Me

A demo for Christmas Experiments 2017: follow the footsteps of an invisible being across the snow, steer a light that stirs the particles, and watch the spheres glow to the rhythm of the music by gloom.

  • Experience
  • Particles
  • GPGPU
  • Noise
  • Post-processing
  • WebGL
  • three.js

Create

Codevember 2017

Fifteen experiments for Codevember 2017, a shorter run exploring simulations and post-processing with WebGL and three.js.

  • Series
  • GPGPU
  • Particles
  • Post-processing
  • WebGL
  • three.js
  • Webcam & mic

Create

WebVR Experiments: Speak To Go

A Google Creative Lab experiment that takes you anywhere in the world: say where you want to go and Google Maps, the Speech-to-Text API and WebVR put you there. Part of the WebVR Experiments launch.

  • Client work
  • Panoramas
  • WebVR
  • WebGL
  • three.js
  • Maps

SpeakRender Conf, Oxford, UK

The Future of the Web in a VR World

Where the web is going in VR: the technology, browsers, APIs and programming behind it.

  • Talk
  • WebVR

Create

Dark Haze

A Christmas Experiments collaboration: a 3D scene by cbuyukberber you can interact with a little, code with Marpi and music by gloom. Lots of ambiance with pixel texture and furry polygons.

  • Experience
  • Particles
  • Post-processing
  • WebGL
  • three.js
  • GLSL

SpeakThe Graphical Web, Exeter

WebGL, WebVR and Information Visualisations

How WebVR brings immersive environments to the browser, and new ways to represent and interact with data.

  • Talk
  • WebVR
  • WebGL

Create

Codevember 2016

Thirty days of experiments for Codevember 2016, with WebGL, three.js, Web Audio and procedural generation.

  • Series
  • GPGPU
  • Particles
  • Procedural modelling
  • WebGL
  • three.js
  • Web Audio

Create

The Polygon Shredder

Exploration of curl noise and half-cube pseudo-instancing, using WebGL, three.js and some GLSL trickery.

  • Experiment
  • GPGPU
  • Particles
  • Noise
  • WebGL
  • three.js
  • WebVR

Create

THREE.MeshLine

A replacement for THREE.Line with real width, where native WebGL lines are stuck at 1px: expanded in the shader, with dashes and textured lines.

  • Library
  • Lines
  • WebGL
  • three.js
  • GLSL

Create

X-Mas Virus

Entry for the 2015 Christmas Experiments site. A throwback demo of neon flickering lights, made with WebGL, three.js, GLSL and Web Audio. 3D art and music by acidbeat.

  • Experience
  • Post-processing
  • WebGL
  • three.js
  • GLSL
  • Web Audio

Create

Día de Muertos 2015

Design your own calaca for Día de Muertos: a 3D skull you decorate with decals. 3D art and design by acidbeat.

  • Experience
  • WebGL

Write

Optimising SVG load with Service Worker

How to use Service Worker to optimise the loading of SVG assets in a page without altering coding methods.

  • Tutorial
  • Performance
  • CSS & SVG
  • JavaScript

Write

Calculating FPS past requestAnimationFrame limit with requestIdleCallback

Using requestIdleCallback to calculate FPS more precisely than with requestAnimationFrame.

  • Article
  • Performance
  • JavaScript

SpeakFullStackFest (FutureJS), Barcelona

The Road to WebVR

Getting started with WebVR: its history, the options from Cardboard to the Oculus Rift, and the challenges in rendering, design and interaction.

  • Talk
  • WebVR
  • WebGL
  • CSS & SVG

Write

Can the new Google logo be 305 bytes?

Techniques and tricks learned while trying to recreate the new Google logo with SVG in 305 bytes (or less!).

  • Article
  • CSS & SVG

Create

Google I/O 2015 Toy

The Google I/O 2015 logo in a room: click to throw it around. Real-time physics and analytical local ambient occlusion, made with WebGL, Web Audio API, three.js, oimo.js and Wagner.

  • Web toy
  • Physics
  • Ambient occlusion
  • WebGL
  • three.js
  • Web Audio

SpeakJSConf Budapest, Budapest

Getting things done with three.js and WebGL

Real-time graphics in the browser with three.js and WebGL, from the structure of an app to the main parts of the API.

  • Talk
  • WebGL
  • three.js

SpeakScotlandJS, Edinburgh

What are shaders and what can they do for me?

Fragment shaders beyond pictures: using the GPU to search data, run complex calculations and even synthesise music.

  • Talk
  • GPGPU
  • WebGL
  • GLSL

SpeakResonate, Belgrade

Experiments with today's web technologies

A workshop on making interactive music videos with Canvas, WebGL and Web Audio: drawing in 2D and 3D, and syncing visuals to sound.

  • Workshop
  • Canvas 2D
  • WebGL
  • Web Audio

Create

Speech Jammer

A speech jammer to warp your reality: it plays your voice back with an adjustable delay that makes it hard to keep talking. Built with Web Audio API and WebRTC getUserMedia.

  • Web toy
  • Web Audio
  • Webcam & mic

Write

Live WebGL Shader Editor

This article goes a bit over the method to augment JavaScript APIs and how to use it to create a plug-n-play, live GLSL shader editor.

  • Making of
  • Dev tools
  • WebGL
  • GLSL
  • JavaScript

Create

Monolith

Demo for NVScene 2015 in collaboration with cabbibo, ranked 5th: a black monolith stands alone in an empty desert, and the closer the camera drifts, the stranger things get. Music by awwz.

  • Demo
  • Post-processing
  • Ambient occlusion
  • Particles
  • Noise
  • WebGL
  • three.js

SpeakAwwwards Conference, Barcelona

The Web in the age of WebGL

With Ricardo Cabello (mrdoob): what WebGL brings to the table, with the process, workflow and tools behind some of our projects.

  • Talk
  • WebGL
  • three.js

Write

cru·ci·form study in architecture visualisation

How the project was built from scratch, with technical details like parallax-corrected cubemaps, and lessons learned along the way.

  • Making of
  • Image-based lighting
  • Post-processing
  • WebGL
  • three.js
  • GLSL

Create

cru·ci·form

A study in architecture visualisation with models by sejnulla. Nice music, glossy reflections, slow tracking shots, custom shading and postprocessing, using three.js and Wagner.

  • Experience
  • Post-processing
  • WebGL
  • three.js
  • GLSL
  • WebVR

Create

B E Y O N D

Real-time WebGL demo with cabbibo for Christmas Experiments 2014. Crystal growth simulation, sound processing, custom shading and postprocessing.

  • Experience
  • Simulation
  • Post-processing
  • WebGL
  • three.js
  • GLSL
  • Web Audio

Create

It's a message in a Jack-o-lantern

Online interactive experience for Halloween, in which the user can carve a stencil into a procedurally generated pumpkin and share it.

  • Experience
  • Procedural modelling
  • WebGL

SpeakThe Graphical Web, Winchester

Getting started with WebGL and three.js

An almost-live coding workshop building a WebGL project from scratch with three.js, up to custom shaders and post-processing.

  • Workshop
  • Post-processing
  • WebGL
  • three.js
  • GLSL

Create

Decals for three.js

Decals implementation for three.js, useful for temporary decorations like bullet impacts, blood splatters, burns or skid marks; or for weathering effects on objects.

  • Library
  • WebGL
  • three.js

SpeakScotlandJS, Edinburgh

Getting started with three.js and WebGL

An introduction to real-time graphics in the browser with three.js and WebGL, no 3D maths required.

  • Talk
  • WebGL
  • three.js

SpeakResonate, Belgrade

Using the web as a creative platform

The web, the browser and its emerging libraries as a platform for creative coding, with a look at some of my work.

  • Talk
  • Generative
  • JavaScript

SpeakFutureJS, Barcelona

Everybody dance now with Web Audio API

Playing and modifying sounds in the browser with the Web Audio API, its possibilities and its limitations.

  • Talk
  • Web Audio
  • JavaScript

Write

Creating Android Lens Blur Depth Viewer

Reading, decoding and rendering depth data from the new Android Lens Blur camera application. Turn depth data back into 3D models.

  • Making of
  • WebGL
  • three.js
  • GLSL

Write

Using hooks to make development of shaders a bit easier

Using function augmentation via hooks to show GLSL compile errors on the page instead of the console, with a bit of DevTools trickery.

  • Article
  • Dev tools
  • WebGL
  • GLSL

Create

SnowBox

A 3D tool to create snow thingies, though really they are snowmen: metaballs for the snow, plus carrots, buttons, bowties, hats and twigs. In collaboration with claudioguglieri and Sejnulla. Lots of 2D, 3D and code goodness!

  • Experience
  • Isosurfaces
  • Procedural modelling
  • WebGL

Create

Bumpy metaballs

Isosurface with Marching Cubes, bump mapping with normal mapping and triplanar mapping, shading with a MatCap shader.

  • Experiment
  • Isosurfaces
  • MatCap
  • WebGL
  • three.js
  • GLSL

SpeakMIRA Lab, Barcelona

Generative and reactive geometry with JavaScript and WebGL

A step-by-step workshop on generating geometry with JavaScript and WebGL and making it react to sound.

  • Workshop
  • Generative
  • WebGL
  • Web Audio

Create

Spherical Environment Mapping (MatCap/LitSphere) and Normal Mapping

Spherical Mapping (MatCap/LitSphere) with Normal Mapping, using WebGL and GLSL. This is an editor to toy around with different materials, normals and render effects. With subdivision modifier, noise and rim lighting.

  • Experiment
  • MatCap
  • WebGL
  • three.js
  • GLSL

Write

Loading sound files faster using Array Buffers and Web Audio API

How to reduce the number of requests when your page has a lot of sound assets: pack them into one file and slice it into ArrayBuffers for the Web Audio API.

  • Tutorial
  • Performance
  • Web Audio

Write

Creating a Spherical Environment Mapping shader

Creating nice lighting with a simple spherical mapping shader. A step-by-step tutorial on how to create a matcap or litsphere material with GLSL and three.js.

  • Tutorial
  • MatCap
  • WebGL
  • three.js
  • GLSL

Create

NPR Sketch GLSL shader

Real-time post-processing shader to create the style of old architectural drawings.

  • Experiment
  • NPR
  • Post-processing
  • WebGL
  • three.js
  • GLSL

Create

Cross-hatching GLSL shader

Blinn-Phong shading and rim lighting. Based on the Microsoft Research "Real-Time Hatching" paper.

  • Experiment
  • NPR
  • WebGL
  • three.js
  • GLSL

Write

Web Audio Input and Windows

Getting Chrome's new Web Audio Input feature to work on Windows.

  • Article
  • Web Audio
  • Webcam & mic

Create

Shake a flake | Reactive snow

A holiday experiment with reactive snow using WebGL, Web Audio API, WebRTC and localStorage. Blow into the microphone to make the falling snow shake and twirl.

  • Web toy
  • Particles
  • WebGL
  • three.js
  • Web Audio
  • Webcam & mic

Write

Vertex displacement with a noise function using GLSL and three.js

A tutorial on the basics of vertex shaders: displacing a mesh's vertices with a noise function, using GLSL and three.js.

  • Tutorial
  • Noise
  • WebGL
  • three.js
  • GLSL

Write

Split-flap display with CSS and JavaScript

An homage to low technology presence in the web of the 21st century: a split-flap display, created with HTML, CSS3 and JavaScript.

  • Tutorial
  • CSS & SVG
  • JavaScript

Write

The new site is live

After several versions that never saw the light of the tubes, the newest and shiniest version of clicktorelease.com is live!

  • Article
  • CSS & SVG
  • JavaScript

Create

It's a Halloween Message!

Carve any message into a procedurally generated Halloween pumpkin. An experiment in procedural generation of meshes and custom shading.

  • Experience
  • Procedural modelling
  • WebGL
  • GLSL

Create

Rocking Dendrites

Dendrites rocking to the music, drawn with billboard particles to fake a soft, out-of-focus depth of field. Play with the generation settings or drop in your own songs. Music by Hunz.

  • Experiment
  • Generative
  • Particles
  • WebGL
  • three.js
  • Web Audio

Create

CCapture.js

CCapture.js is a JavaScript library to help capture animations created with HTML5 canvas at a fixed framerate.

  • Library
  • Video capture
  • Canvas 2D
  • JavaScript

Create

Mars Panoramas in WebGL redux

A panorama viewer using data from Ashima Group Panorama Viewer that doubles as a Fullscreen API and Pointer Lock API experiment.

  • Experiment
  • Panoramas
  • WebGL
  • three.js

Create

Adorable Flying Sagan

Put a coin in and Carl Sagan flies away. A quick and funny experiment with linked CSS3 transforms and animations and HTML5 audio, using the amazing art by SirMitchell and music by Shugo Tokumaru.

  • Web toy
  • CSS & SVG

Write

Experiments with Perlin noise

Experimenting with Perlin noise in the vertex and fragment shaders, using WebGL with three.js.

  • Tutorial
  • Noise
  • WebGL
  • three.js
  • GLSL

Create

Latitude Reflection Mapping

First step in a series of experiments toward image-based global illumination for models using Google Street View panoramas. This is the test for an environment mapping shader that uses equirectangular panoramas.

  • Experiment
  • Image-based lighting
  • Panoramas
  • WebGL
  • three.js
  • GLSL

Write

How to make clouds with CSS 3D

A tutorial on how to use CSS 3D Transforms to create sprite-based 3D-like clouds.

  • Tutorial
  • CSS & SVG
  • JavaScript

Create

CSS3D Clouds

An experiment on creating 3D-like clouds with CSS3 3D Transforms and a bit of JavaScript.

  • Experiment
  • CSS & SVG
  • JavaScript

Create

Conway's Game of Life in 3D

An eye-candy version of Conway's Game of Life in 3D. An experiment using WebGL with three.js to get familiar with the library.

  • Experiment
  • Simulation
  • WebGL
  • three.js

Create

Animated GIF in 3D

Stack the frames of an animated GIF in 3D, see the animation from every side, and twist the stack along its axis. Uses WebGL with three.js and the Drag and Drop API.

  • Experiment
  • WebGL
  • three.js

Create

WebGL Light Box

A pure WebGL light box to show images in a web page. A rework of the previous lightbox that was built using three.js to use only the exact amount of code necessary.

  • Experiment
  • WebGL
  • GLSL

Create

The Wilderness Downtown

Interactive music video for Arcade Fire by Google and B-Reel, directed by Chris Milk: type in the address where you grew up and it plays out on your own streets, to show off HTML5 and Chrome. I built the aerial map sections and part of the Street View ones, with a lot of canvas action.

  • Client work
  • Canvas 2D
  • Maps
  • Panoramas