Baking mesh maps
Baking pre-computes a set of mesh maps from your geometry — Curvature, Ambient Occlusion, Position, Thickness, and more. These maps are the data your masks read to place wear and dirt automatically.
Why bake?
Mask generators are procedural: a Curvature Wear generator brightens exposed edges, a cavity generator darkens crevices, a position-based generator masks by height. None of that works from nothing — each generator reads a baked map. No Curvature bake → no edge wear; no Position bake → no position mask. Baking is therefore the first step before you reach for the automatic masks described in Masks & generators.
The maps
Tick the maps you want in the Bake dialog. Each one is a different view of the geometry:
| Map | What it is |
|---|---|
| Normal | Tangent-space normal map — projects high-poly surface detail onto the low-poly. Needs a high-poly assigned; without one it bakes a flat result. |
| Ambient Occlusion | Ray-traced occlusion: how shadowed each point is by surrounding geometry. Drives cavity/dirt masks. |
| Curvature | Surface convexity/concavity from normal divergence. The map edge-wear generators read. |
| Position | World position normalised to the mesh bounding box. Lets you mask by height / location. |
| World Normal | World-space normal of the low-poly surface. Used to mask by facing direction (e.g. top-down dust). |
| Thickness | Inverted AO cast along the reversed normal — how thin the geometry is. Good for subsurface / grime in thin areas. |
| ID Map | A flat per-region colour map. Lets a mask or fill select a whole region by exact colour. See ID source below. |
ID map source
The ID map can be built from two sources, chosen per texture set in the ID Map panel's Source dropdown:
| Source | What it does |
|---|---|
| Vertex Color (default) | Copies the low-poly's per-vertex colours (e.g. Blender vertex paint) straight into the map. |
| Material ID (High-poly) | Projects a distinct generated colour per high-poly material onto the low-poly UVs. |
Material ID (High-poly) needs a high-poly mesh loaded — it reads the high-poly's material slots. With no high-poly assigned it falls back to Vertex Color.
Running a bake
Open the Bake dialog, tick the maps you want, then press Bake. Every checked texture set bakes in sequence — uncheck a set in the Texture Sets list to skip it. A progress bar shows Set X/Y · Baking <map> — N/M maps and you can keep orbiting the model while it runs. Press Cancel to stop at the next map boundary; maps already baked are kept.
High-poly to low-poly
Assign a high-poly mesh in Common Settings → High-poly mesh. The high-poly's fine detail is projected onto the low-poly's UVs to build the Normal map (and, optionally, the Material-ID map). Assigning is instant — the sculpt is only parsed the first time it's needed.
Match by mesh name
When parts overlap in space, a low-poly texel's projection ray can hit the wrong neighbour's high-poly (the leaves polluting the bark, say). The Match by mesh name dropdown controls this:
| Mode | Behaviour |
|---|---|
| Always (default) | The ray hits the closest high-poly surface regardless of part. |
| By mesh name | Restricts each low-poly part's ray to the high-poly part whose name matches it. Only active with a high-poly loaded; affects the Normal, World Normal, Curvature and ID bakes. |
Names are paired by stripping suffixes: bark_low ↔
bark_high. The suffixes are editable in Common Settings —
Low poly suffix (_low), High poly suffix
(_high) and Ignore backface suffix
(_ignorebf). The Matching by name panel at the bottom
of the dialog lists the resolved pairs and flags any part that didn't
match.
Cage offset
Cage offset is how far above the low-poly surface each projection
ray starts, expressed as a fraction of the mesh's bounding-box diagonal
(default 0.05). It drives every ray-casting bake (Normal, AO,
Thickness). Larger values catch more high-poly detail; too large and rays
punch through neighbouring geometry.
AO & Thickness self-occlusion
AO and Thickness each have a Self-occlusion dropdown that decides which geometry counts as a blocker — this works on a single mesh's named parts and needs no high-poly:
| Mode | Behaviour |
|---|---|
| Always (default) | Every part occludes every other part. |
| Only same name | A part is only occluded by geometry whose suffix-stripped name matches its own (so the arm won't darken the torso). Uses the same suffixes as Match by mesh name. |
The AO and Thickness panels also expose Rays / texel (default 128 /
64), Max distance (a fraction of the bounding-box diagonal),
Min occluder distance (self-hit cutoff, default 0.001),
Spread angle (180° = full hemisphere) and an Ignore
backfaces toggle.
Anti-aliasing (per map)
Each map has its own Anti-aliasing dropdown. Supersampling renders a map larger and averages it down to remove jagged edges — but the cost and the benefit differ a lot by map:
| Map | Default | Why |
|---|---|---|
| Normal | 2× | Needs AA; cheap to supersample (1 ray/texel). |
| AO / Thickness | Off | Expensive (128 / 64 rays) and forgiving. |
| Curvature | Off | Bump to 2× for crisp edges. |
| Position / World Normal / ID | Off | Don't benefit (ID is categorical, so AA is point-discarded). |
The default (Normal 2×, the rest Off) gives sharp normals at a fraction of the cost of supersampling everything.
Output size
Output size sets the baked map resolution, independent of your painting resolution. Leave it on Use per-set to keep each set's stored resolution, or pick a fixed size (256–4096) to resize every checked set before baking.