Skip to content

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.

Screenshot 01 — Hero shot — Editor open with a paint stroke mid-action on a 3D mesh — Settings panel on the left, painted mesh in the viewport, brush gizmo visible at the cursor.


  • 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
  • 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.

There are two equivalent paths:

From the Content Browser:

  1. Right-click in the Content Browser
  2. Pick EQLabs → Painting Lab Asset
  3. Name the asset; double-click to open

From the EQLabs Hub:

  1. Open Window → EQLabs Hub
  2. Search for Painting or browse to Art → Paint
  3. 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.


ControlWhat it does
3D Mesh / 2D Canvas toggleSwaps between mesh-projected painting and flat-canvas painting
Assign MeshPicks the static mesh to paint on (3D mode only)
Assign Preview MaterialPicks a material containing a PaintedTexture parameter for live mesh preview
Tool selectorPaint / Erase / Smooth / Fill / Clear
SymmetryOff / Mirror X / Mirror Y / Mirror XY (4-way) / Radial N segments
Ramp EditorOpens the gradient/ramp authoring popup
Import TextureLoads an existing texture as the starting canvas state
Undo / RedoCtrl+Z / Ctrl+Y, 20-level stack, per-stroke transaction

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.

FieldWhat it does
SizeBrush radius — UV-space units in 3D mode, canvas pixels in 2D
StrengthPer-stamp opacity / influence, 0–1
FalloffEdge softness, 0 (hard) → 1 (fully feathered)
SpacingGap between brush stamps, in distance or time
Spacing ModeDistance (Photoshop-style) or Time (paint-fastness independent of cursor speed)
Brush TipOptional grayscale texture used as a custom stamp shape
Live preview ringDraws the brush footprint at current settings

Screenshot 02 — Custom brush tip stamps — Multiple stamps from a stylized brush tip (splatter / leaf / hatch shape) clearly visible on the canvas. Brush tip texture preview in the Settings panel showing the alpha mask currently loaded.

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.

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.

Screenshot 03 — Mask mode + channel packing — Mask mode active with three independently-painted channels (R / G / B) composed into a final channel-packed result alongside.

FieldWhat it does
Output FolderContent Browser folder for the exported UTexture2D
FilenameBase name; per-texture suffixes added on multi-export
FormatPNG (8-bit sRGB) / EXR (16-bit linear) / Auto (Color → PNG, Flow / Direction / Mask → EXR)
Resolution OverrideOptional resolution at export — defaults to canvas size
Sprite Sheet GridFor 2D canvas atlas export: 4×4 / 6×6 / 8×8
Channel MappingRGBA assignment — which paint channel writes to which output channel

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.


  1. Create or open the Painting Lab asset
  2. In the Texture List panel, click Add Texture and pick a resolution + paint mode
  3. Assign Mesh from the toolbar — pick a static mesh
  4. Assign Preview Material — must have a PaintedTexture texture parameter; without it, painting still works but you won’t see live updates on the mesh
  5. Pick a paint mode (Color / Flow / Direction / Mask) in the Paint Mode panel
  6. Set brush size / strength / falloff
  7. Paint on the mesh in the viewport — the preview material updates live

Screenshot 04 — Flow mode with directional arrows — Close-up of the canvas during Flow painting; arrow overlays clearly visible per stroke showing direction. Underlying water material visibly responds to the painted flow.

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

Screenshot 05 — Radial symmetry painting — Radial-6 symmetry mode active, brush stroke on one segment mirroring instantly to the others. Symmetry indicator visible in the UI.

  1. Add a Mask-mode texture
  2. In the Paint Mode panel, label the four channels — e.g., Rust, Wetness, Damage, EdgeWear
  3. Click the active channel in the channel strip and paint
  4. Use the per-channel view selector (R / G / B / A / All) to inspect each layer separately
  5. 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”
  1. Click Import Texture in the toolbar
  2. Pick a UTexture2D asset
  3. The pixel buffer is loaded into the active texture
  4. Paint corrections / additional details on top
  5. Export normally

SettingDefaultRange / Type
Paint ModeColorColor / Flow / Direction / Mask
Brush Size5.00.150.0
Brush Strength0.801
Brush Falloff0.501
Brush Spacing10150
Spacing ModeDistanceDistance / Time
SymmetryOffOff / Mirror X / Mirror Y / Mirror XY / Radial
Radial Segments4216 (Radial mode only)
UV Channel007
Texture Resolution1024256 / 512 / 1024 / 2048 / 4096
Export FormatAutoPNG / EXR / Auto
Tiling Previewfalsebool
Triplanar Projectionfalsebool
Channel Labels (Mask)R / G / B / Astring × 4

Asset persistence: the painting session is stored inside the .uasset itself — there is no separate JSON config or sidecar. Magic number 0x504E544C + version tag.


  • Exports produce real UTexture2D assets 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 Niagara SubUV use 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.

Screenshot 06 — PNG + EXR export — Content Browser showing freshly-exported PNG and EXR assets from a paint session. Source mesh in the level using the painted texture.


  • Preview material discipline — without a PaintedTexture parameter, 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.


Report an issue with this tool

Opens our feedback form in a new tab with the tool name pre-filled.