The Atelier
Paint over a render per object, bake it to the object, and take the paint back into Unreal or Blender.
Repo path: docs/atelier/atelier-workflow.md Companions: painterly-system-roadmap.md (what and why), ingest-contract.md (what the render must deliver), texture-export.md (getting paint back into Unreal/Blender), decisions.md.
One system, one node graph. The Atelier is Layouts ▸ Atelier: the viewer is the canvas, the Atelier panel on the right holds the brush, the objects, the strokes and the bake; every paint action is a node operation with an undo, saved in the project like everything else.
Opening the Atelier opens a canvas. Layouts ▸ Atelier (or forged-app --atelier) selects the nearest PaintOver or, in an empty project, makes one over a blank Canvas at the project size — you can draw the moment the layout lands, like Photoshop or Procreate. The layout is Rebelle's shape: the Tools strip down the left of a full-height canvas, Atelier · Brushes · Node Graph tabbed top-right, Layers · Control Panel below. Every one is an ordinary dock tab. The Atelier panel's New canvas form makes another sheet at any size, paper colour or transparent. You never select a node to paint: the brush works on the PaintOver the viewer shows.
The nodes live on the Atelier shelf tab: Canvas (blank paper), PaintOver (the strokes, the layers), ObjectBake + ObjectApply (paint that sticks to objects), BS_Painterly (the automatic painter), BS_LineArt (contours and hatching), CoherentNoise (grain that tracks the world), BS_Advect (media carried by motion).
---
1. Five minutes: paint on a rendered object and make it stick
- Read the shot's multilayer EXR sequence (beauty +
uv+ cryptomatte;P/N/depthwelcome). If the UV pass is called something else, name it on the PaintOver. - Layouts ▸ Atelier. Add a
PaintOverafter the Read, select it. The panel's first line says what the render delivers — ✓ ShotPaint- ready, or which pass is missing. - In Objects, click the thing you want to paint (the list is the cryptomatte manifest). In Brush, set anchor to object, or pick the *Paint the object* preset.
- Scrub to any frame. Drag on the viewer. The stroke shows at once.
[]size ·Shift+[]hardness ·1…0opacity ·Ctrl+Zundoes one stroke. - Add an
ObjectBakeafter the PaintOver and anObjectApplyafter that; view the ObjectApply. Press ⚒ Bake (panel or Control Panel). Scrub: the paint rides the object through the camera move and the deformation. - Paint more on other frames — the front at frame 40, the side at frame 90 — and ⚒ Bake again: one texture results. The panel says ⚠ stale whenever a stroke, a knob or the render changed since the bake; it never shows yesterday's paint quietly.
- The bake is the export:
atelier/<node>/<object>.<udim>.exrbeside the project, plusbake.json. Hookup for Unreal and Blender intexture-export.md.
Lighting. lighting = as painted (default) keeps the light the stroke was painted under. relit un-lights the stroke and re-lights it by each frame's own light, so it darkens into shadow — it needs an albedo pass, and the panel greys it out (naming the pass) when the render has none.
2. Plain canvas (Photoshop / Procreate mode)
Layouts ▸ Atelier. A Canvas → PaintOver is already there (or the panel's New canvas form makes one: project / HD / 4K / 2048² / 4096² or any size, paper colour, or transparent). Anchor paper, medium dry or wet. Concept art, matte painting and from-scratch textures are first-class; nothing below is different for them.
Tools (the strip; keys work with the pointer on the canvas): Brush (P) lays paint; Eraser (E, toggles back) takes paint off the active layer only, never the picture; Smudge (U) drags the paint already on the layer along and lays none of its own; Fill (K) covers the active layer with a click; Pick reads the colour under the pointer — Alt+click does it with any tool. Alt-drag or middle-drag pans, the wheel zooms, Ctrl+Z takes back one stroke. Below the tools: the colour picker with a palette and the last eight colours you laid, and the brush as it is right now — size, opacity, hardness, flow, spacing, smoothing (StreamLine: hand jitter out, long clean curves higher up), taper (thin in and out over N px), speed (a fast flick is thinner — pressure for a mouse), grain (paper tooth) and the blend.
Feel. The stroke you see while the pen is down is stamped by the same code that lands it — no placeholder line — and it stays on screen after pen-up until the frame that carries it arrives, so a stroke never blinks. A tablet's pressure is used when Windows reports it; until a pen path exists, taper and speed stand in.
Layers (the Layers tab): a Procreate stack, top of the list on top. + adds a layer above the active one, - deletes it (and its strokes), ▲ ▼ reorder, ⧉ duplicates (strokes too), the eye hides, the number is its stroke count, the slider its opacity, the menu its blend (normal · multiply · screen · add), 🔒 locks it. Every stroke lands on the active layer (the ● row). Painting on a hidden or locked layer is refused and the status line says which control to use. The stack lives on the PaintOver (layers, active_layer) and is undoable like everything else.
Brushes (the Brushes tab): 59 built-in brushes in seven categories — Sketching (pencils, charcoals, chalk, conté), Inking (technical pen, brush pen, markers, calligraphy, ink wash), Painting (round oil, flat, filbert, fan, palette knife, gouache, impasto, dry brush, glaze, blender), Airbrush, Watercolour (wet), Textures (stipple, sponge, grunge, canvas, cloud, smoke, hair, foliage), Shaders (True Grit-style texture brushes: grain shaders fine to coarse, laid paper, halftone dot screens, hatch and crosshatch, riso and screen print, mezzotint, litho crayon, woodcut — their pattern is locked to the sheet, so shading builds as dots or lines however strokes overlap) and Effects (glow, shade, erasers, smudges). The category is a dropdown; Imported is one of them. Each card is the stroke the brush lays; clicking one sets the brush in one undo and never touches your colour. Imported lists every .abr tip in %APPDATA%/Forged/brushes (drop packs there or Import .abr…); an imported tip is embedded in the project so it renders on a machine without the pack, and a tip found nowhere is named on the node and drawn round meanwhile.
3. Wet media
Pick Watercolour wash, Ink wash, Water brush, Dry brush (or medium = wet in Brush). While the pen is down the water holds still — what you lay is what you see, instantly. Lift the pen and watch: the wash creeps, blooms, granulates, runs downhill with tilt, and dries before your eyes. The time you watch is recorded into the project, so a reopened project replays the same drying — working wet-into-wet, onto-damp or onto-dry are genuinely different, exactly like paper.
The Wet layer section is the physics: wetness (how far), load (how dark), evaporation (how fast it dries), diffusion (wet-in-wet softness), re-wetting (standing water re-liquifies dried paint — 0 for staining pigments; the Water brush uses this to soften a dry edge or push a bloom into damp paint), drips (pooled water on a tilted board breaks into droplets that run and leave trails), and the time row: speed (the drying clock), pause, and Dry layer (freeze it now — undoable, like everything else). The Dry brush preset is barely wet and touches only the paper's peaks — broken lines that ride the tooth, best over a dried wash. Splash throws wet drops at the sheet. Mixing = pigment (Kubelka–Munk, blue + yellow makes green) or light. The Mixer mixes two pigments and sends the result to the brush.
Wet strokes are simulated on the paper only, over a region that grows with the water, at half resolution by default (sim); the same strokes give the same wash on every scrub.
4. Strokes in space (halos, fuzz)
Anchor 3D (or the *Halo (3D)* preset): each point remembers the surface under it from the position pass; level floats the stroke off the surface along the normal. It rides every frame and hides behind nearer things. Needs P; without it the stroke stays on the paper and the status line says so.
5. Annotations (grease pencil)
N picks the Note tool (the Tools strip's last entry; N again goes back to the brush). A drag writes a hard, opaque marker in the brush colour and size on the Notes layer — made on the spot the first time, same undo — for this frame and the next annotation_hold − 1 (the strip's *stays*; 1 = this frame only, 0 = for ever). Notes are seen and never paint: they stay out of the paint plane, out of every bake and every ObjectApply, and the Atelier panel's Notes row lists them by frame (click to jump) with one *shown* switch — annotations = hide — that takes every notes layer out of the picture before a render.
The older way still works: the *Annotation* preset, or any paper stroke with lifetime in/out set, shows only between those frames — but it is paint, and it renders.
6. The whole shot as a painting
BS_Painterly after the Read (needs P for strokes that stay on the surface; without it they are a paper layer and the node says so).
- Start from a preset: Oil · Impasto · Gouache · Watercolour (dry) · Pointillist. Then
spacing(the biggest control),length,hardness,color_jitter. - Lock the lattice. The node reports
cell_size is auto (0.0123); type that intocell_size. Now strokes are anchored to the world for the whole shot instead of to this frame's framing. cadence = 2for on-twos;boil+boil_ratefor rationed life.flatten(Kuwahara radius) for flatter colour fields under the strokes.- ⚒ Bake frames when you are done tuning: playback then reads files. A moved knob makes the bake ⚠ stale.
BS_LineArt for the engraved / sketched looks: contours from the id, depth and normal passes (exact — never fooled by a shadow), hatching in the dark tones that rides the surface. Presets: Engraving · Ink sketch · Contours only · Plate edges (the last for footage with no passes).
CoherentNoise for grain, paper and jitter fields that stay put on the surface (noise layer for other nodes, or applied directly).
7. Media that moves with the picture
BS_Advect: in = the shot (with its motion pass, or a MotionVectors before it), texture = what to carry (a CoherentNoise, a paper texture, a PaintOver's paint). texture mode regenerates every period frames and cross-fades; strokes mode carries each key frame's paint both ways for horizon frames — for strokes that should smear off the surface (anchor advected on the PaintOver, then keys = the frames you painted on).
8. When something looks wrong
Look at the node's ⚠ badge and the status bar first. The Atelier never degrades silently:
| It says | It means | Do |
|---|---|---|
| UV pass looks FILTERED | seams average two islands; baked paint would land on garbage | render UV/ID unfiltered or supersampled |
| UV pass is tagged COLOUR | it would be quantised to half and colour-managed | add it to the Read's data_channels |
| anchor = object needs a UV pass / cryptomatte | the render lacks them | deliver the passes (ingest-contract.md) |
| lighting = relit needs an albedo pass | no basecolor / albedo layer | deliver it, or paint as painted |
| ⚠ stale | a stroke, knob or upstream changed since the bake | ⚒ Bake again |
| no position pass — strokes live on the paper | no P | deliver P, or accept a paper layer |
| cell_size is auto (…) | the lattice follows this frame's framing | set cell_size to the reported value |
| solving optical flow for N pairs | no motion pass | deliver motion or add a MotionVectors |
9. The keys, while a PaintOver is selected and the pointer is on the canvas
[ ] size · Shift+[ Shift+] hardness · 1…9, 0 opacity 10%…100% · P brush · E eraser (toggles) · U smudge · K fill · Alt+click picks a colour · drag paints · Ctrl+Z one stroke · Alt-drag or middle-drag pans · wheel zooms.