From Asset Rules (Generated), which is the same JSON the validators read. Change a rule in the bubbly-asset-rules repo, not here.
Which category
Before anything on this page applies, a texture has to be in the right category. The six are
not one axis, so the answer is a ladder rather than 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.
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.
The short version of the question everyone asks: a leaf is Cutout. Alpha is what gives it its
shape, and step 5 catches it before Surface can. A leaf sheet a particle system drives is Effect, because
step 2 caught it first. A leaf tint mask is Mask. What reads the texture decides, not what it
shows.
Where they go
Assets/Exported/Textures/<CATEGORY>/<Set>, with the category folder named exactly as the token
(Surface, not Surfaces or the old SURF) and one folder per texture set holding every map of it:
The set is the unit you browse; the role suffix is what tells the files inside it apart. The folder
does not repeat the prefix: Surface/Wallpaper_01, not Surface/T_Surface_Wallpaper_01.
Sprite is the exception and lives under Exported/Images/UI, split Shared and Specific.
UI art has its own pipeline.
Texel Density
Definition: texels per metre of world-space surface. resolution = size_m × density, rounded to
the nearest power of two.
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
Two assets that will be seen next to each other must share a tier. Mismatched density beside
itself is far more visible than low density everywhere.
This is the one rule on this page a tool cannot check, because nothing in the pipeline knows what will end
up beside what. It matters most for kits, where every piece is by definition seen next to its
siblings, so a kit declares its tier once and the kit owner enforces it.
Short-hand Resolution Guide
Advisory. The density formula is what decides; this is for when you want a number quickly.
Type
Resolution
Note
Surface (Tiling)
2048 x 2048
Or bigger if tiling is big.
Object (<0.5m)
1024 x 1024
Object (<2m)
2048 x 2048
Object (>4m)
4096 x 4096
Import Settings
Unity applies these automatically, keyed off the role suffix in the file name. A texture named _Normal gets the normal-map settings on import without anyone touching the inspector. 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 do not recognise is left completely alone. If you need one to keep
settings that differ from its role, add it to exceptions.json. That suppresses the warning and
stops the importer rewriting it.
Overlay Textures
Overlays are applied through the [[Modular 3D Assets - Texturing#Additional UV channels|second and
third UV channels]], and masked by the vertex colour alpha channel. 0 means no overlay on that
vertex, 1 means full overlay.
Older assets instead mask the overlay with a fully transparent right-hand 5% margin in the texture.
That method still works and those assets do not need converting, but it is not what new work should
use: the margin blends with its neighbours at lower mip levels, so the overlay ghosts at distance.
That is invisible until a model shows the overlay somewhere it should not, which is usually much
later and on someone else's asset.
If you do need the margin method (because the mesh is too coarse to carry a useful vertex mask), the
texture must import with wrap mode Clamp, and either no mipmaps or at least 32 px of transparent
padding. TEX006 still checks for the margin; it is deprecated and goes away once the remaining
assets are converted.