‹  Research

Research · Generative graphics

ink-wash-painting

Can a language model paint 水墨 that doesn’t look like a template? The answer tested here: only if it first learns to see a subject the way a painter does, then simulates the material, then criticises its own picture at zoom.

Ink-wash painting: a pavilion by a misty river, full moon, plum branch in red, a small boat and the characters 月满中秋.
Live: the reference scene 月满中秋 (full moon, mid-autumn) from the repository’s reference/ folder. WebGL2 shaders for paper, water and ink — no images, no libraries.

Status

Open source

Period

September 2026

Stack

JavaScript · WebGL2 · GLSL · Canvas

Quality comes from seeing, composing, material and self-critique — in that order. Motifs come last.

The skill never reuses the reference scene. It copies only the generic material core and writes a new pipeline for every subject.

1Problem

Asked for an ink painting, a model reaches for the same picture every time: mountains, a moon, water. Given a worked example, it copies the example — the skill’s own notes call that the first cause of template pictures.

When it does draw something new, the computer shows through: strokes of flat width, ink that sits in beads, visible stitching between marks, blur applied evenly everywhere, and a grey mush where the tones should separate.

The style is not a set of motifs (mountains, moon, pavilion). It is a way of seeing plus a material.references/seeing.md

2Questions

Can principles carry over to any subject?

If the skill teaches how a painter translates a subject instead of shipping a scene generator, does a pagoda, a canal city or a cat come out as convincing as the river scene?

Which techniques hide the computer?

What in the simulation of paper, water and brush removes the tells that make digital ink look digital?

3Method

  1. See before drawing

    Five questions for every subject: its spirit (神), what is solid and what is empty (实 / 虚), which family of line it needs, how many depth planes, and which format.

  2. Compose by the canon

    One host and its guests (主宾), empty paper as a shape (留白), hiding and revealing (藏露), one focal point, one to three red accents, at most one inscription and one seal.

  3. Paper and water

    Paper with fibre ridges. Every mark writes into a wetness map, which then spreads along the fibres over about 36 diffusion steps on half-float textures — with darkened edges, granulation and a soft halo.

  4. A grammar of the brush

    Width varies with the length of the stroke, not per point; a pressed entry and a lifted exit; a dark core offset for a centred or slanted tip (中锋 / 侧锋); ink drying along the stroke into flying white (飞白). Ten stroke families, from ruled architecture to texture strokes (皴) and boneless washes.

  5. A renderer ordered by depth

    Every element has a depth between 0 and 1. Washes go through the diffusion pass; a separate ink layer sits on top and cuts what is behind it.

  6. Criticise at zoom

    At least two rounds of critique on six zoomed crops, against checklists for composition, tone, execution, grounding and motion — and the delivery states honestly what is still weak.

Paper is the light. Sky, water, snow, white walls, mist and lit sides are unpainted paper. Nothing glows.SKILL.md
Close-up of the pavilion, pines and reeds, showing ink diffusion into paper fibres and dry-brush breaks.
Detail at double resolution: the pavilion and pines. Washes bleed along the paper fibres and darken at their edges; reeds and branches break where the brush runs dry.

4Results

1 sceneOne complete worked example — 1,999 lines of JavaScript and GLSL, the scene above.
~50 lessonsSymptom → cause → fix entries collected while building it, from “beads” to “grey mush”.
10 stroke familiesA table of brush strokes, each with its pressure curve, width and drying behaviour.
3 test promptsA large pagoda, a canal city in mist, a cat on a windowsill in rain — written as evaluations; results not yet recorded.
Suggest, don’t enumerate. 40 tile strokes read as a roof; 400 read as a texture map.SKILL.md

5Limitations

  • Only one reference scene exists; the first question — does it carry over to any subject — is open until the three test prompts are run and kept.
  • No photographic detail, cast shadows or full colour, by design. Faces, hands and anatomy are weak.
  • New subjects start without motif code; the haze in the shared core is still tied to the reference scene’s horizon bands.
  • Needs WebGL2 with float render targets; older and some mobile GPUs cannot run it.

Sources and prior work