Make a Texture Set

A texture set is every map of one thing (albedo, normal, roughness and whatever else) sharing a
name and a folder. The set is the unit you browse; the role suffix tells the files inside it apart.


1. Pick the category

Six categories, and they are not one axis, so this is a ladder, not a lookup. Read top to
bottom, stop at the first yes.

Which texture category

Id Rule Severity Value
CAT002 Texture is not in the category the texture ladder puts it in info

Read top to bottom and stop at the first yes.

# Ask Then it is
1 Is it drawn in screen space, like UI, an icon, or a 2D element with no world surface behind it? Sprite
2 Is it read by a particle system or a VFX graph rather than by a surface shader? Effect
3 Does it carry no colour of its own? Is it a mask or a lookup a shader reads OVER another texture? Mask
4 Is it one sheet a whole kit maps bands of, rather than a texture for one object? Trim
5 Does alpha cut its silhouette? Would it read as a rectangle without it? Cutout
6 Anything still here. Surface
  • Two answers still standing: take the one HIGHER on the ladder, the same as for models.
  • The texture category does not follow the model category and never has. A TTrim sheet on an SMKit piece is the normal case, and a Prop can carry a Cutout.
  • A map's ROLE is not its category. Albedo, Normal, Roughness and the rest are the RoleSuffix. Every category ships the maps it needs, and T_Surface_Wallpaper_01_Normal is a Surface texture whose role is Normal.
  • Ask what reads it, not what it shows. The same painted leaf is Cutout on a foliage card, Effect as a flipbook frame in a leaf-fall effect, and Mask if a shader only ever samples one channel of it.

Sprite

Anything drawn in screen space: UI, icons, frames, crosshairs, 2D art.

  • Test. Is it scaled to a rect on screen rather than mapped to a surface in the world?
  • Includes. Buttons and panels · Icons · Frames and borders · Crosshairs and reticles · 2D art and portraits
  • Authoring. texelDensity exempt, maxResolution 2048

Effect

A texture a particle system or VFX graph reads: flipbooks, noise fields, gradients, distortion and motion vectors.

  • Test. Is it sampled by an effect graph rather than by a surface shader?
  • Includes. Flipbook sheets · Noise fields · Colour ramps and gradients · Distortion offsets · Motion vectors · Soft particle sprites
  • Authoring. texelDensity exempt, maxResolution 2048, requirePowerOfTwo true

Mask

A texture with no colour of its own, read over another one: damage, edge wear, RGB tint masks, blend masks.

  • Test. Does a shader read a CHANNEL of it to modulate something else, rather than showing it?
  • Includes. Damage and wear masks · Edge masks · RGB tint masks (see texture.rgbMask) · Blend and vertex-blend masks · Opacity masks read separately from a surface
  • Not. A packed PBR texture is not a Mask. It is part of a surface and ships as TSurface_01_Packed. Mask is for a map read on its own, over a material it is not part of.
  • Authoring. requiredMaps none, sRGB false

Trim

One sheet a whole modular set shares, laid out in strips that pieces map bands of.

  • Test. Do several different meshes map different bands of this one sheet?
  • Authoring. texelDensity trim, sharedPerSet true

Cutout

A surface whose silhouette is cut by alpha. Without the alpha it reads as a rectangle.

  • Test. Is the shape of the thing in the alpha channel rather than in the mesh?
  • Includes. Leaf and foliage atlases · Grass and fern cards · Ivy and vine sheets · Chain-link, grating and lattice · Torn paper, netting, lace · Cobwebs
  • Not. A leaf sheet a particle system drives is Effect, because step 2 caught it first. A leaf texture a shader only samples one channel of is Mask.
  • Authoring. texelDensity as declared, requiredMaps Albedo, Roughness, Normal, alpha opacity only

Surface

An ordinary opaque surface. The default, and the one every other category is defined against.

  • Test. Anything the five questions above did not claim.
  • Includes. Tiling material surfaces: brick, plaster, grain, cobblestone · Baked object textures for a single mesh · Anything opaque, mapped to geometry, read by a surface shader
  • Authoring. texelDensity by tier, requiredMaps Albedo, Roughness, Normal

Settled texture edge cases

Thing Category Why
Leaf atlas, foliage card, grass card Cutout Alpha cuts the silhouette. Step 5 before step 6, so it is never Surface.
Falling-leaf flipbook for a particle system Effect Step 2 catches it before the alpha question is asked. What reads it decides.
Bark, tree trunk surface Surface Opaque. The silhouette is the mesh's.
Leaf colour-variation mask Mask No colour of its own; a shader samples a channel of it over the albedo.
Smoke, fire, spark sheet Effect Read by a VFX graph. TEX008 owns its grid.
Noise field, gradient ramp, distortion map Effect Same reason. The role suffix says which, the category says who reads it.
Kit-wide strip sheet Trim Several meshes map bands of one sheet. Named for the Set.
Baked texture for one prop Surface An ordinary surface that happens to be unique to one mesh. T_Surface_OldChair_01_Albedo.
Packed metallic/AO/detail/roughness map Surface Part of a surface, not a mask over one. Its role suffix is Packed.
Rust, grime, damage overlay Mask Read over a base material. T_Mask_Rust_01 over a steel material, never T_Surface_Rust_01 standing alone.
UI button, icon, frame, crosshair Sprite Screen space. Lives in Exported/Images/UI, not in the texture roots.
Decal texture (blood, poster, grime patch) Cutout A projector needs the alpha to know where the decal stops. The MESH it projects onto is the Effect category; the texture is not.
Chain-link fence, grating, lattice Cutout The holes are in the alpha, not in the geometry.
Skybox, cubemap Surface Nothing above claims it, and step 6 is the catch-all. It declares its own resolution; the density formula does not apply and nothing pretends it does.

Surface is what a texture is for, Cutout is how it is authored, Trim is how it is laid out,
Mask is what it carries, Sprite is where it is drawn, Effect is what reads it.

The question everyone asks: a leaf is Cutout. Alpha is what gives it its shape. A leaf sheet
driven by a particle system is Effect, because that step caught it first. A leaf tint mask is Mask. What
reads the texture decides, not what it shows.

2. Name the set

T_Surface_Wallpaper_01_Albedo
│ │       │          │  └── RoleSuffix: which map this is
│ │       │          └───── Num
│ │       └──────────────── Descriptor: the set
│ └──────────────────────── Category: a capitalised word
└────────────────────────── Type: T_

Every map in the set shares everything but the suffix.

3. Work out the resolution

resolution = size_m × density, rounded to the nearest power of two. Density is texels per metre
of world-space surface, by tier:

texelDensity (px/m)

tiers

Key Value
hero 1024
standard 512
background 256
trim 512

byCategory

Key Value
Trim trim

settings

Key Value
exemptCategories Sprite, Effect

Default: standard
Tolerance: 0.25

Tier Applies to
Hero Player hands and weapons, close-inspection props, key story objects
Standard The default: props, kit pieces, characters
Background Large structures, distant terrain, skyline geometry
Trim Measured across the tiling extent, not the object

Ceiling: 4096, whatever the formula says. A project can set it lower (Tiny Bakery uses 2048), see Asset Rules (Generated) > Project overrides.

Adjacency beats the formula

Two assets that will be seen next to each other must share a tier. This is the one rule on this
page no tool can check, because nothing in the pipeline knows what ends up beside what. For a kit,
the owner declares the tier once for the whole set.

Want a number quickly? Texture Workflow > Short-hand Resolution Guide. It's advisory. The formula
decides.

4. Author the maps

Every material ships Albedo, Roughness and Normal. The rest are optional. The full list of role
suffixes is in Naming Conventions > Role-Suffix.

Two things worth deciding now rather than later:

Channel packing. We pack where we can, and the shader supports both. A packed texture is named
_Packed:

Channel Type
R Metallic
G AO
B Detail
A Roughness

RGB masking, if this thing needs colourways. Paint the base in values only, black and white,
then a separate mask where each channel maps to one of the material's colours: R primary, G
secondary, B tertiary. One set of textures, any number of colour schemes, and changing a colour theme
is changing a material rather than repainting a texture.

5. Put it in its folder

Assets/Exported/Textures/<CATEGORY>/<Set>/

Category folder named exactly as the token: Surface, not Surfaces or the old SURF. One folder per set, holding
every map of it. The folder does not repeat the prefix: Surface/Wallpaper_01, not
Surface/T_Surface_Wallpaper_01.

Exported/Textures/Surface/Wallpaper_01/T_Surface_Wallpaper_01_Albedo.png
                                    T_Surface_Wallpaper_01_Normal.png
                                    T_Surface_Wallpaper_01_Roughness.png

Sprite is the exception. It lives under Exported/Images/UI, split Shared and Specific.
UI art has its own pipeline.

6. Let Unity import it

You do not touch the inspector. Unity reads the role suffix in the file name and applies the
right import settings automatically. _Normal gets normal-map settings, and so on. That is what
makes "we import textures separately for maximum control" true rather than aspirational.

importSettings

Key Value
Albedo sRGB: true; compression: high
Roughness sRGB: false; channel: SingleChannel
Normal sRGB: false; type: NormalMap
AO sRGB: false; channel: SingleChannel
Metallic sRGB: false; channel: SingleChannel
Emissive sRGB: true; compression: high
Height sRGB: false; channel: SingleChannel
Damage sRGB: false; channel: SingleChannel
EdgeMask sRGB: false; channel: SingleChannel
Packed sRGB: false; compression: high
Flipbook sRGB: true; compression: high
Noise sRGB: false; channel: SingleChannel
Gradient sRGB: true; compression: none
Distortion sRGB: false; compression: high
MotionVector sRGB: false; compression: high

A texture whose name the rules don't recognise is left completely alone. A typo doesn't produce
a wrong setting, it produces no setting, which is much easier to spot.

Genuinely need different settings? Add it to exceptions.json. That suppresses the warning and
stops the importer rewriting it.

7. Make the material

Named for the texture set it is built from, not the mesh it lands on:

T_Surface_Wallpaper_01   →   M_Surface_Wallpaper_01

One wallpaper material goes on a wall, a screen and a scrap of torn paper. Naming it after any one of
the three would be naming it after an accident. Swap the prefix to find the pair.

A tint variant is the base name plus one PascalCase word naming the variation, not where it was
first used: M_Surface_Wallpaper_01_Cream, never ..._Tavern.

8. Check and commit

Check Your Work, then commit with the .meta files alongside their textures.