The 3D Handbook
Key term

UV mirroring and stacking

Letting mirrored or repeated parts of a mesh share the same UV space to save texture resolution, and how to bake, light and shade such layouts without errors.

uvbakingtexturingoptimisation

UV mirroring and stacking means placing several parts of a mesh on the same area of the UV layout so that they share the same texture pixels. Unreal's documentation states the basic rule: in normal texture UVs, "Triangles in the UV mapping can overlap", which applies "one area of a texture" to several parts of the mesh (Unreal Engine documentation: Using UV Channels With Static Meshes). Mirroring is the special case where the two halves of a symmetrical object share one half of the texture.

Dylan Abernethy groups stacking with "breaking out of the 0,1 UV space" as the "more advanced UV layout techniques" that beginners find hard (ArtStation: Better Understanding UV Layout Techniques for…). This page covers the parts that cause most problems: baking, seams and lightmaps.

#Mirroring and stacking compared

  • Mirroring flips one half of a symmetrical mesh onto the other half's UVs. A symmetrical crate, helmet or car body needs only half the texture space, so the remaining half can double the texel density of what is left.
  • Stacking places identical repeated parts, such as the four wheels of a cart or a row of bolts, on top of each other. Each copy shows the same texture.

Both trade unique detail for resolution. Anything on a stacked or mirrored shell appears on every copy, including text, which reads backwards on the mirrored side.

Left, a single UV tile with a light grey shell and an orange dashed copy almost on top of it; an orange bar marks the mirror line. Right, two tiles side by side; the 0 to 1 tile holds the grey shell and the 1 to 2 tile holds the dashed copy, moved exactly one tile to the right.
Stacked shells share pixels. For baking, move all copies but one exactly one UV tile away so the baker sees only a single shell; a wrapping texture still shows the same pixels on the moved copy.Diagram by the handbook author

#Offsetting stacked shells for baking

A baker writes every shell into the texture. If two shells lie on top of each other, both are baked into the same pixels, and as one Polycount poster puts it, "One side is going to end up being wrong" (Polycount: Stacked UV Shells and Normal Maps).

The usual fix is to keep one shell in the 0–1 square and move every copy out of it. In the same thread cman2k suggests: "You can offset the UVs out of the 0 to 1 UV space" (Polycount: Stacked UV Shells and Normal Maps). EarthQuake adds that this "Works in any app", with the drawback that it gets awkward "if you need to edit your layout" (Polycount: Stacked UV Shells and Normal Maps). Move the copies by a whole tile (1.0 UV unit), not a fraction, so that the offset copy still lines up with the same pixels when the texture repeats.

#Tangent-space seams on the mirror line

A mirrored shell has flipped UVs, so the tangent space and MikkTSpace basis on that side has the opposite handedness. In the Polycount thread Warheart explains a normal-map problem on stacked shells: "The problem is that the handedness is different on each side" (Polycount: Stacked UV Shells and Normal Maps). He also points to the old Maya tangent space being "based on UV winding order", and m4dcow suggests the Maya fix of ticking "the Maya derivatives box" (Polycount: Stacked UV Shells and Normal Maps).

Most mirror-line seams come from the baker and the engine computing tangents differently. Marmoset's advice applies directly: "bake your normal map with the same tangent space that your renderer uses", and MikkTSpace ("Mikk / xNormal") is a good default (Marmoset: The Toolbag Baking Tutorial). Two other habits help:

  • Put the mirror line on a hard break or a hidden area, such as the underside or a panel line, so a small lighting step is not visible.
  • Do not paint over the seam with flat normals. Rooster128 suggests blending a 128-128-255 layer at the seam; Warheart answers "I don't think that painting the normal map out toward the seam is good practice in this case" (Polycount: Stacked UV Shells and Normal Maps). Fix the tangent basis instead.

#When to avoid it

  • Lightmaps. Baked lighting needs unique space for every face: Unreal states that in a lightmap "no two triangles in the mesh can overlap in the 2D texture space", because each part receives different light (Unreal Engine documentation: Using UV Channels With Static Meshes). Mirrored and stacked layouts belong in UV channel 0 only, with a separate lightmap channel.
  • Unique detail. Text, damage and dirt that should differ on each side; see unique texturing.

#How to make one

These steps use Blender; the tool names come from the Blender Manual (Blender Manual: UV Editing). In Maya the order is the same, using the UV Editor (see the table below).

  1. Model one half and use a Mirror modifier, or keep the mesh symmetrical. Unwrap the half you will keep as the texture source.
  2. Copy the UVs across. With the full mesh, use UV > Copy Mirrored UV Coordinates. It "Copies UV coordinates from one side of a symmetrical mesh to the mirrored side"; raise Precision if the mesh is slightly off-symmetry (Blender Manual: UV Editing).
  3. Stack repeated parts. Select identical shells and snap them on top of each other, for example with Snap > Selected to Cursor (Offset) (Blender Manual: UV Editing). Flip a shell with Mirror X or Mirror Y where needed: "UVs can be mirrored on the Y axis or the X axis" (Blender Manual: UV Editing).
  4. Pack without breaking the stacks. In Pack Islands, enable Merge Overlapping: "overlapping islands are detected and temporarily combined", and their relative position is preserved (Blender Manual: UV Editing). See UV packing and padding.
  5. Offset the copies for baking. Select every duplicate shell except one and move it by exactly one tile. The Move on Axis operator with Type > UDIM moves "by full UV tiles (1.0 UV unit)"; with no modifier, Numpad 4 and 6 move left and right (Blender Manual: UV Editing).
  6. Bake normals and AO as usual (see baking and bake cage) with the same tangent space as your engine (Marmoset: The Toolbag Baking Tutorial). Leave the offset in place for export; with a wrapping texture the copies read the same pixels.

#Video tutorials

Cover of Dylan Abernethy's free tutorial series, which covers stacking, mirroring, working outside 0–1 and baking for game assets.Dylan Abernethy, via ArtStation

#In different tools

Tool Mirroring and stacking Offset for baking
Blender Copy Mirrored UV Coordinates, Mirror X/Y, Snap, Pack Islands with Merge Overlapping (Blender Manual) Move on Axis, Type UDIM (1.0 UV unit)
Maya Flip and stack shells in the UV Editor Move shells by 1 in U; mind tangent settings when baking in Maya (Polycount)
Marmoset Toolbag, Substance Painter Bake what the UVs give them Offset shells are ignored outside 0–1; keep the tangent space matched to the engine (Marmoset)
Unreal, Unity, Godot Overlapping texture UVs are fine in channel 0 (Unreal Engine documentation) Lightmap channel must be unique

#Further reading and watching

References

  1. Epic Games · Using UV Channels With Static Meshes · Unreal Engine documentation · docs · accessed 2026-10-22
  2. Dylan Abernethy · Better Understanding UV Layout Techniques for Games (Free Tutorial) · ArtStation · course · accessed 2026-10-22
  3. Polycount forum (cman2k, EarthQuake, Warheart, Rooster128, m4dcow, Mark Dygert) · Stacked UV Shells and Normal Maps · Polycount · forum · accessed 2026-10-22
  4. Joe Wilson · The Toolbag Baking Tutorial · Marmoset, 2017 · article · accessed 2026-10-22
  5. Blender Foundation · UV Editing (Tools) · Blender Manual (source on projects.blender.org) · docs · accessed 2026-10-22

Also consulted

Last updated 2026-10-22