Painting Lab
Painting Lab
Section titled “Painting Lab”Type: Custom Asset Editor (Pattern B) · Asset class:
UPaintingLabAsset· Category: Labs
A full in-editor texture painting workspace. Paint directly on a static mesh in a UV-projected 3D viewport, or switch to a flat 2D canvas for VFX sprites and standalone textures. Four paint modes cover the texture types you actually ship — straight RGBA Color, direction-encoded Flow, tangent-space Direction, and per-channel Mask. The asset is a real .uasset that holds every texture in the session — multi-texture per asset, switch between them with one click, export the whole set as PNG (8-bit sRGB) or EXR (16-bit linear). No round-trip to Substance Painter for flowmaps, damage masks, or hand-painted VFX sprites.

When to use it
Section titled “When to use it”- Authoring flowmaps for water / cloth / lava materials — Flow mode encodes brush direction directly into RG channels
- Painting damage and wear masks that hook into a layered material (rust, wetness, edge wear, dirt) — four labeled channels per RGBA texture
- Hand-painted VFX sprites (alpha shapes, erosion masks, splatter decals) on the 2D canvas, with tiling preview to evaluate seamlessness
- Painting anisotropic direction maps (hair, brushed metal) using the Direction mode, which encodes the brush comb into the surface tangent space
- Quick texture polish on top of an imported source — drop an existing texture in as the canvas starting point and paint corrections
When not to use it
Section titled “When not to use it”- Don’t expect a Substance Painter replacement for full PBR layer authoring — Painting Lab is per-texture, not per-material-stack. There’s no non-destructive layer system in V1 (deferred to V2).
- Don’t paint on meshes with overlapping UVs without symmetry off — mirrored UVs paint both regions simultaneously. Use UV channel 1+ for a non-overlapping set.
- Don’t use this for terrain texture painting — UE’s Landscape painting is a different problem; Painting Lab targets per-asset textures, not landscape weight maps.
- Triplanar fallback is for preview only on UV-less meshes — the painted result is world-space projected and won’t be portable to UV-based tools.
Creating the asset
Section titled “Creating the asset”There are two equivalent paths:
From the Content Browser:
- Right-click in the Content Browser
- Pick EQLabs → Painting Lab Asset
- Name the asset; double-click to open
From the EQLabs Hub:
- Open Window → EQLabs Hub
- Search for
Paintingor browse to Art → Paint - Click the Painting Lab tile — the launcher offers Create New or opens recent assets
The asset is a UPaintingLabAsset .uasset. It survives across sessions, holds every texture you’ve painted, and serializes with a magic number + version tag so future format changes load cleanly.
Editor layout
Section titled “Editor layout”Toolbar (top)
Section titled “Toolbar (top)”| Control | What it does |
|---|---|
| 3D Mesh / 2D Canvas toggle | Swaps between mesh-projected painting and flat-canvas painting |
| Assign Mesh | Picks the static mesh to paint on (3D mode only) |
| Assign Preview Material | Picks a material containing a PaintedTexture parameter for live mesh preview |
| Tool selector | Paint / Erase / Smooth / Fill / Clear |
| Symmetry | Off / Mirror X / Mirror Y / Mirror XY (4-way) / Radial N segments |
| Ramp Editor | Opens the gradient/ramp authoring popup |
| Import Texture | Loads an existing texture as the starting canvas state |
| Undo / Redo | Ctrl+Z / Ctrl+Y, 20-level stack, per-stroke transaction |
Viewport (center)
Section titled “Viewport (center)”In 3D Mesh mode it’s an SEditorViewport with the assigned mesh. The brush cursor tracks the mesh surface in UV space; what you paint shows up live on the mesh through the assigned preview material’s PaintedTexture parameter. Triplanar projection mode is available for meshes without UVs.
In 2D Canvas mode it’s a flat SPaintingLabCanvas widget with pan/zoom. The canvas displays at the configured resolution. Optional Tiling Preview wraps the canvas as a 3×3 repeat to evaluate seam continuity.
A per-channel view selector (R / G / B / A / All) lets you isolate one channel for inspection — critical when authoring channel-packed mask textures.
A UV wireframe overlay (toggle in toolbar) draws the mesh’s UV islands on top of the texture preview so you can see exactly what gets painted where.
Brush Settings panel
Section titled “Brush Settings panel”| Field | What it does |
|---|---|
| Size | Brush radius — UV-space units in 3D mode, canvas pixels in 2D |
| Strength | Per-stamp opacity / influence, 0–1 |
| Falloff | Edge softness, 0 (hard) → 1 (fully feathered) |
| Spacing | Gap between brush stamps, in distance or time |
| Spacing Mode | Distance (Photoshop-style) or Time (paint-fastness independent of cursor speed) |
| Brush Tip | Optional grayscale texture used as a custom stamp shape |
| Live preview ring | Draws the brush footprint at current settings |

Paint Mode & Channel panel
Section titled “Paint Mode & Channel panel”Top row picks the active Paint Mode (Color / Flow / Direction / Mask).
In Color, this panel exposes the color picker, opacity, and per-channel R/G/B/A toggles. In Flow and Direction, it shows the live direction arrow (mouse delta → vector) and the encoding preview (how the brush direction is being written to RG). In Mask, it exposes a channel strip — four user-labeled channels (e.g., “Rust”, “Wetness”, “Damage”, “Edge Wear”). Click a channel to make it the active paint target.
Texture List panel
Section titled “Texture List panel”The asset can hold any number of textures. Each row shows the name, resolution, paint mode, and a thumbnail. Clicking switches the active painting target. Add Texture appends a new one; Remove Texture deletes the active. Each texture has its own independent resolution and paint mode.

Export panel
Section titled “Export panel”| Field | What it does |
|---|---|
| Output Folder | Content Browser folder for the exported UTexture2D |
| Filename | Base name; per-texture suffixes added on multi-export |
| Format | PNG (8-bit sRGB) / EXR (16-bit linear) / Auto (Color → PNG, Flow / Direction / Mask → EXR) |
| Resolution Override | Optional resolution at export — defaults to canvas size |
| Sprite Sheet Grid | For 2D canvas atlas export: 4×4 / 6×6 / 8×8 |
| Channel Mapping | RGBA assignment — which paint channel writes to which output channel |
Asset model — what’s stored
Section titled “Asset model — what’s stored”The UPaintingLabAsset serializes:
- The full texture list with paint mode, resolution, channel labels, and the live pixel buffer per texture
- Brush settings (last-used size / strength / falloff / spacing / symmetry)
- Mesh reference (soft pointer) + preview material reference
- UV channel selection
- Export settings (last-used folder / format / sprite grid)
- Magic number
0x504E544C+ version tag — the format is forward-compatible; old assets load, new fields default
Pixel buffers are persistent. Reopening the asset weeks later restores every texture, every channel, every label.
Workflow
Section titled “Workflow”Painting on a 3D mesh
Section titled “Painting on a 3D mesh”- Create or open the Painting Lab asset
- In the Texture List panel, click Add Texture and pick a resolution + paint mode
- Assign Mesh from the toolbar — pick a static mesh
- Assign Preview Material — must have a
PaintedTexturetexture parameter; without it, painting still works but you won’t see live updates on the mesh - Pick a paint mode (Color / Flow / Direction / Mask) in the Paint Mode panel
- Set brush size / strength / falloff
- Paint on the mesh in the viewport — the preview material updates live

Painting on a 2D canvas
Section titled “Painting on a 2D canvas”- Toggle the toolbar from 3D Mesh to 2D Canvas
- The canvas appears at the configured resolution
- Paint as you would in any 2D editor
- Toggle Tiling Preview to see the canvas wrapped as 3×3 — verify seamless edges
- (Optional) Open the Ramp Editor to author a precise gradient with stops

Multi-channel mask authoring
Section titled “Multi-channel mask authoring”- Add a Mask-mode texture
- In the Paint Mode panel, label the four channels — e.g.,
Rust,Wetness,Damage,EdgeWear - Click the active channel in the channel strip and paint
- Use the per-channel view selector (R / G / B / A / All) to inspect each layer separately
- Export as EXR — channel mapping in the Export panel controls which paint channel writes to which output channel
Importing an existing texture as a starting point
Section titled “Importing an existing texture as a starting point”- Click Import Texture in the toolbar
- Pick a
UTexture2Dasset - The pixel buffer is loaded into the active texture
- Paint corrections / additional details on top
- Export normally
Settings reference
Section titled “Settings reference”| Setting | Default | Range / Type |
|---|---|---|
| Paint Mode | Color | Color / Flow / Direction / Mask |
| Brush Size | 5.0 | 0.1 – 50.0 |
| Brush Strength | 0.8 | 0 – 1 |
| Brush Falloff | 0.5 | 0 – 1 |
| Brush Spacing | 10 | 1 – 50 |
| Spacing Mode | Distance | Distance / Time |
| Symmetry | Off | Off / Mirror X / Mirror Y / Mirror XY / Radial |
| Radial Segments | 4 | 2 – 16 (Radial mode only) |
| UV Channel | 0 | 0 – 7 |
| Texture Resolution | 1024 | 256 / 512 / 1024 / 2048 / 4096 |
| Export Format | Auto | PNG / EXR / Auto |
| Tiling Preview | false | bool |
| Triplanar Projection | false | bool |
| Channel Labels (Mask) | R / G / B / A | string × 4 |
Asset persistence: the painting session is stored inside the
.uassetitself — there is no separate JSON config or sidecar. Magic number0x504E544C+ version tag.
Engine integration
Section titled “Engine integration”- Exports produce real
UTexture2Dassets in the configured Content Browser folder. Color → 8-bit sRGB PNG; Flow / Direction / Mask → 16-bit linear EXR; Auto picks based on the active mode. - Sprite sheet export packs 2D canvas frames into a single atlas at the configured grid (4×4, 6×6, 8×8). Output is a standard
UTexture2D, ready for NiagaraSubUVuse or Material flipbook sampling. - Live preview material must contain a texture parameter named
PaintedTexture. The active painting texture is bound to that parameter every frame. - Hub cross-tool launchers — the Texture Paint Suite Hub tool ships an Open in Painting Lab button so you can hand off splat-map painting workflows for refinement.

Tips & gotchas
Section titled “Tips & gotchas”- Preview material discipline — without a
PaintedTextureparameter, painting still functions but you’ll see nothing on the mesh. Easiest setup: a one-node material that samples a texture parameter into Base Color. - Triplanar fallback is preview-only — paints in world space rather than UV space, so the result isn’t portable to other tools. Use only when the mesh has no usable UVs.
- Big brushes group as one undo step — a single drag with a large brush and many stamps is one undo transaction, not one-per-stamp.
- Max canvas resolution is 4096×4096 — for larger textures, paint as a sprite-sheet atlas or tile across multiple textures in the same asset.
- Symmetry interacts with overlapping UVs — meshes with mirrored UVs paint twice when symmetry is off. Either turn symmetry on or move to a non-overlapping UV channel.
- Smooth tool is a box-blur — for high-frequency detail recovery, use small brushes and multiple passes; large blurs over fine detail are destructive.
- Brush tip textures — the optional grayscale stamp swaps the round default for any shape. Useful for spatter, hatching, or stroke-end caps.
Related tools
Section titled “Related tools”- Texture Paint Suite — splat map authoring with an Open in Painting Lab hand-off button
- Texture Channel Packer — pack Painting Lab EXR mask exports into combined ORM / channel-packed textures
- Smart Mask & Texture Processor — feed Painting Lab masks through procedural refinement
- Flipbook Maker — feed Painting Lab 2D-canvas sprite-sheet exports into Niagara flipbook authoring
- Material Texture Baker (Universal Bake Suite) — bake high-poly normal/AO/curvature first, then use Painting Lab to paint damage and color on the baked result
Opens our feedback form in a new tab with the tool name pre-filled.