Skip to content
Andrew Voirol
WorkLogAboutContact
HomeWorkLog

AboutContact

✦ Just one prompt away from figuring it all out.

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.

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

Started Aug 15, 2026
View Source
永 (eternity) character painted in sumi carbon black ink

永 character — the calligraphy benchmark. Every stroke tests a different brush dynamic.


Five Nihonga mineral pigments with brush strokes
Water dilution comparison showing dry and lush ink bloom
Tarashikomi wet-on-wet blending technique
Ink flow behavior showing absorption patterns

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

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

WorkBuilder’s LogAboutContactRSS Feed

Connect

X / TwitterGitHubLinkedIn

© 2026 Andrew Voirol✦Just one prompt away from figuring it all out.