Skip to content
Andrew Voirol
Work → MUJŌ: WebGPU Watercolor Engine
Creative EngineeringWIP

MUJŌ: WebGPU Watercolor Engine

A physics-based Japanese calligraphy and watercolor simulation running entirely in WebGPU compute shaders. Kubelka-Munk pigment mixing, Navier-Stokes fluid dynamics, and 48-bristle brush physics — all on the GPU.

Code

5 pigments · 3 brushes · 3 papers · 60fps GPU

Started Aug 15, 2026
Five Nihonga mineral pigments with curved brush strokes showing unique absorption and scattering

Five authentic Nihonga mineral pigments — each with unique Kubelka-Munk scattering coefficients.


Fast cursive calligraphy strokes in sumi carbon black ink on Kizuki Kōzo washi
MUJŌ watercolor atelier — clean washi paper canvas with Suzuri palette, brush selector, water dilution and canvas tilt controls
Water dilution comparison — dry sumi stroke above, lush Ai bloom below at 90% dilution
Tarashikomi wet-on-wet blending — Shu vermillion dropped into Ai indigo on Kobishi paper
永 (eternity) character close-up showing brush pressure dynamics and fiber absorption
Animated WebGPU watercolor painting with live mineral pigment diffusion and wet-on-wet blending

MUJŌ (無常) started as a question: can you make a digital brush that feels like real sumi ink on handmade washi paper? Not "looks like" in a screenshot — feels like under your hand.

The answer required going deep.

The physics stack

Every simulation pass is a custom WGSL compute shader — no Three.js, no React, no physics libraries.

LayerWhat it doesMethod
Ink flowFluid spreading across paperNavier-Stokes + Jacobi pressure solver
Pigment mixingPhysically correct color blending2-flux Kubelka-Munk spectral radiative transfer
Paper absorptionInk soaking into virtual fibersDarcy tensor porous flow
Brush dynamics48 elastic guide bristlesPosition-Based Dynamics
EvaporationCoffee-ring edge darkeningPinning model with radial deposition

Why build this

The Japanese ink painting tradition is built on impermanence — that's what 無常 means. Each stroke is unrepeatable. The ink reacts to your speed, pressure, and water ratio in ways you can't fully control. Most digital painting tools fake this with procedural textures. MUJŌ simulates the actual physics so the ink behaves — it doesn't just look right, it moves right.

What's in the engine

  • Five Nihonga mineral pigments: Sumi carbon black, Gofun oyster white, Ai indigo, Shu vermillion, Roku green. Each has measured Kubelka-Munk absorption and scattering coefficients.
  • Three Japanese brush types: Fude (calligraphy), Menso (detail), Hake (wash). Different bristle counts, stiffness curves, and ink loading capacities.
  • Three washi paper surfaces: Hosho (smooth), Gasenshi (absorbent), Torinoko (sized). Different fiber densities and absorption rates.
  • Procedural sound engine: Brush-on-paper audio responds to pressure and speed.
WebGPUShadersSimulationCreative

Related Threads

MUJŌ watercolor app showing five Nihonga mineral pigment brush strokes — Sumi (black), Shu (red), Ai (indigo), Ōdo (ochre), and Rokushō (green) — on Kizuki Kōzo washi paper, with the Suzuri Palette, brush selector, water dilution slider, and canvas tilt controls

Building MUJŌ: WebGPU Watercolor Engine

A physically-based Japanese watercolor and sumi-e simulation running entirely on WebGPU compute shaders — Kubelka-Munk optics, fluid dynamics, 3D elastic bristle physics, and Zen impermanence.


Andrew Voirol

Builder, hacker, shipper. Currently leaving localhost.

Navigate

WorkThreadsBuilder's LogAboutContactRSS Feed

Connect

X / TwitterGitHubLinkedIn

© 2026 Andrew Voirol·Back to top ↑
✦Just one prompt away from figuring it all out.