Graphics · Digital Painting
Working prototype
Volume Painter
The canvas only looks flat: every stroke is paint that stands up off it
What this is
A painting app where a stroke is matter, not pixels: a tube of paint with height, laid down from a finite load, stacking on what is already there. The canvas looks flat and stays flat while you paint. Light it from low and the shadows say how high it stands; twist two fingers and it tips back to show the real stack. A working iPad prototype in Metal, built from the volume, not a picture of it.
The technical shape
- Platform
- iPad, iOS 17+, Metal · finger or Apple Pencil · Pencil force sets pressure, a finger paints at ~0.75
- Source of truth
- analytical capsules, not pixels — up to 4,096 in a ring buffer · the height, colour and wetness maps are baked from them, capped near half the screen and at most 1,024 on an edge · incremental stamps along a stroke, a full rebake every 32 stamps and at the stroke’s end
- Load
- each stroke starts with 3.0 of paint, spent ∝ pressure × length × oil transfer × what remains · the deposit can never exceed the load · when it runs out, the stroke stops depositing; the next one reloads
- Stacking
- hard body: under a stroke the colour is the new paint exactly, no mixing through · a 1–2 texel feathered skirt only at the edge · heights add — a stroke laid over another rides on top of it
- Light
- one raking key, default azimuth 40°, elevation 25° · normals from the height map’s finite differences · wet paint carries a higher, cooler sheen that goes matte as it dries; heavier deposits stay wet longer
- Proof of volume
- the default view is flat orthographic so painting never drifts · a two-finger twist tips the canvas to three-quarters and ray-marches the real baked height map · release and it snaps back flat · inspect only: no painting while tipped
- Frame budget
- 30 fps while painting or while paint is drying · the display pauses when nothing changes
The deep end · full technical outline
Outline v2 · expanding
Paint as matter
Most painting apps treat texture as a trick laid over a flat picture: a bump map, a normal map, a ribbon of pixels. Volume Painter stores the paint itself. Every stroke is a run of capsules, each with two ends, a radius from the pressure, a colour and a mass. That list is the painting. The pictures on screen — a height map, a colour map, a wetness map — are baked from it and can be rebuilt from it at any time, so the picture never becomes the data.
A finite load
A real brush runs dry. Each stroke here starts with a load of 3.0 and spends it in proportion to pressure, distance and how much is left, so a stroke thins toward its end and stops depositing when the load is gone. The total laid down can never exceed what the brush carried. Lift and start again and the brush reloads. That one rule is why the strokes in the film have the shape they do.
Stacking, not blending
Where a new stroke crosses an old one it is a hard body, the way oil impasto is: under the stroke the colour is the new paint exactly, with no pink seeping through from the crimson underneath, and only a texel or two of feathering at its edge. The heights add. A crimson stroke over a white one stands as high as both, and its edge follows the white tube round as it rides over it.
Light and the twist
The canvas is shown flat and straight on, the way you paint. Height has to be read from light: one raking lamp, low at 25°, lights each tube’s near side and throws its shadow across the bare linen, and wet paint carries a cool sheen that goes matte as it dries. To prove the height is real, twist two fingers: the canvas tips back to three-quarters and the display ray-marches the baked height map itself, not a fake bump. Let go and it drops back flat. The film runs this the other way round: it paints on the tipped canvas, so you can watch the height arrive, then brings the finished piece down into the flat view.
Where it is going
The specification goes further than the prototype. Strokes as a signed-distance stream joined by a smooth minimum, so a single viscosity knob decides whether wet paint merges in a fillet or dried impasto stands apart. A crimson knife cutting through wet white that shears the pigments into marbled streaks rather than pink. Glazes whose absorption scales with depth, so a Prussian blue wash slides off the peaks and pools dark in the valleys. And a canvas with no edge: a polyhedron unfolded under the brush, panels pinned up ahead as you pan.
What it is not
Not finished. Built today: capsules with a finite load, hard-body stacking, baked height, colour and wetness, drying, one raking light and the two-finger tip. Not built yet: the smooth-minimum viscosity, the colour shear, the depth-scaled glaze, the palette knife, watercolour and airbrush, the studio-lamp control, the material dock and the infinite canvas. The wash in the film shows what the glaze is meant to do; the app does not do it yet.
Related in the lab
- Holographic TV →
- Shares volume — treating what is on screen as matter with height and depth — not a picture that fakes them.
Built at this bench
The machine, the instrument, the film that explains it — all designed and built in-house. The same bench works for hire.
Services →