Reference

PBR texture naming conventions

Every major library names its maps differently, none of them are wrong, and all of them have to be reconciled the moment your library holds assets from more than one source. The mapping table, the packed-channel decoder, and the six traps that break materials without raising a single error.

No signup, no download, no catch — this is the table I had to build before I could write software that reads these files, and it is more useful in the open than in a codebase.

The cross-library mapping table

Rows are channels; columns are libraries. A dash means that library does not normally ship that map, not that the map does not exist. Green means sRGB, amber means linear data — load it as Raw.

Channel Space Poly Haven Megascans ambientCG Substance Poliigon Game
Base colour sRGB _diff _Albedo _Color _BaseColor _COL _D, _BC
Roughness Linear _rough _Roughness _Roughness _Roughness _ROUGHNESS _R
Glossiness Linear _Gloss _Glossiness _GLOSS _G
Metalness Linear _metal _Metalness _Metalness _Metallic _METALNESS _M
Normal (OpenGL) Linear _nor_gl _Normal _NormalGL _Normal _NRM _N
Normal (DirectX) Linear _nor_dx _NormalDX _Normal_DirectX _N_dx
Height / displacement Linear _disp _Displacement _Displacement _Height _DISP _H
Ambient occlusion Linear _ao _AO _AmbientOcclusion _AmbientOcclusion _AO _AO
Specular level Linear _spec _Specular _Specular _REFL _S
Opacity / alpha Linear _Opacity _Opacity _Opacity _MASK _A
Emissive sRGB _Emission _Emissive _EMISSIVE _E
Bump Linear _bump _Bump _BUMP _B
Translucency sRGB _Translucency _Translucency _SSS _T
Cavity Linear _Cavity _cav
Curvature Linear _Curvature _Curvature _curv
Packed AO/Rough/Metal Linear _arm _ORD _OcclusionRoughnessMetallic _ORM, _RMA

Packed channel decoder

Three greyscale maps stuffed into one RGB image. The acronyms are not consistently ordered between vendors, so read the table rather than the letters — and when in doubt, open the file and look at the individual channels.

Name Red Green Blue Used by
ORM Occlusion Roughness Metallic Unreal Engine standard
ARM Ambient occlusion Roughness Metallic Poly Haven, ambientCG
RMA Roughness Metallic Ambient occlusion Various game pipelines
MRAO Metallic Roughness Ambient occlusion Various game pipelines
ORD Occlusion Roughness Displacement Megascans engine exports

A packed map is always linear data. Never load one as sRGB, even though it looks like a colourful image — it is three unrelated greyscale signals wearing a costume.

Six traps that fail silently

None of these throw an error. Each one produces a render that is merely wrong, which is why they cost so much more time than an outright failure would.

1. Gloss and roughness are inverses, not synonyms

A gloss map plugged into a roughness socket gives you a mirror where you wanted concrete. Invert it — or prefer the roughness map when the library ships both. The two files look nearly identical as thumbnails, which is exactly why this survives so long unnoticed.

Symptom — Everything looks wet or polished.

2. The green channel of a normal map

OpenGL is green-up and is what Blender, Maya, Houdini, Arnold, Redshift and V-Ray expect. DirectX is green-down and is what Unreal and many real-time pipelines expect. Libraries that ship both label them nor_gl / nor_dx or NormalGL / NormalDX; libraries that ship one rarely tell you which.

Symptom — Bumps read as dents, lighting looks inside-out on detail.

3. Colour space is per map, not per material

Base colour and emissive are sRGB. Every other map in a standard PBR set is data and must be Raw or linear. Applications that guess from file extension will guess wrong for most of your set, and nothing will warn you.

Symptom — Roughness reads too glossy, displacement scaled oddly, subtle colour shifts.

4. Metalness and specular workflows are not interchangeable

Metalness/roughness and specular/glossiness are two different parameterisations. A library shipping _REFL or _Specular alongside _GLOSS is giving you the specular workflow; feeding those into a metalness shader as if the names mapped one-to-one produces plausible-looking but incorrect results.

Symptom — Metals look dull, dielectrics look oddly bright.

5. Height maps at 8 bit will band

Displacement needs precision. An 8-bit height map has 256 steps, which shows as visible terracing under real displacement. Use the 16-bit PNG or EXR when the library offers one, and reserve the 8-bit JPG for bump.

Symptom — Stair-stepping across smooth gradients on displaced surfaces.

6. UDIM tiles and resolution tokens confuse set detection

A filename can carry a UDIM number (1001, 1002…), a resolution token (2K, 4k, _8K_) and a channel suffix, in any order. Tools that group texture sets by stripping a trailing suffix will mis-group files where the resolution sits in the middle. Keeping the channel suffix immediately before the extension or the resolution avoids the whole class of problem.

Symptom — One material splits into several, or several merge into one.

A convention for your own files

If you produce textures yourself, or normalise a mixed library, the specific vocabulary matters much less than picking one and never deviating. This pattern survives contact with scripts, asset managers and other people:

pattern
surfacename_variant_channel_resolution.ext

✓ concrete_worn_diff_4k.png
✓ concrete_worn_rough_4k.png
✓ concrete_worn_nor_gl_4k.png

✗ Concrete Worn - Diffuse (4K).png
  spaces, capitals, parentheses, hyphen as separator
✗ concrete_4k_worn_diffuse.png
  resolution in the middle breaks suffix-based grouping

Questions

Is there a standard for PBR texture naming?

No. There is no formal standard and there is unlikely to be one. Each library settled on its own vocabulary early and changing it now would break every downstream script their users have written. The closest thing to a convention is the metalness workflow channel set — base colour, roughness, metalness, normal, height, occlusion — but the names on disk vary freely.

What is the difference between roughness and glossiness?

They are numerically inverted descriptions of the same property: roughness 0.2 is glossiness 0.8. Megascans, Poliigon and older libraries often ship gloss; almost every modern shader wants roughness. Plugging a gloss map into a roughness input without inverting produces a surface that is mirror-polished where it should be matte, and it is the single most common PBR wiring mistake.

What is the difference between OpenGL and DirectX normal maps?

The green channel is inverted between them. OpenGL convention (also called +Y or green-up) is used by Blender, Maya, Houdini, Arnold, Redshift, V-Ray and most offline renderers. DirectX convention (-Y, green-down) is used by Unreal Engine and several real-time pipelines. Using the wrong one does not error — the surface simply lights as though every bump is a dent, which is easy to miss on a low-contrast material and obvious on a brick wall.

Which texture maps should be sRGB and which should be linear?

Only maps that describe a colour a human would perceive should be sRGB: base colour, diffuse, albedo, emissive, and sometimes translucency. Everything else — roughness, glossiness, metalness, normal, height, displacement, ambient occlusion, opacity, specular level, curvature, cavity — is data and must be loaded as Raw or linear. Getting this wrong never raises an error; it just makes the render quietly incorrect.

What does ORM mean?

A packed texture where three greyscale maps share one RGB image to save memory and texture samples: Occlusion in red, Roughness in green, Metallic in blue. ARM is the same thing with Ambient occlusion named explicitly, RMA and MRAO reorder the channels, and Megascans sometimes exports ORD with Displacement in blue instead. Always check which letter is in which channel rather than assuming from the filename — the acronyms are not reliably ordered.

How should I name my own textures?

Pick one vocabulary, use lowercase, separate tokens with underscores, put the channel suffix immediately before the resolution, and never use a space or a hyphen. A workable pattern is surfacename_channel_resolution.ext, for example concrete_worn_rough_4k.png. The specific words matter far less than using the same ones every time, because consistency is what makes both scripts and asset managers able to group your files.

Why this page exists. I had to encode all of it into software. Kiosk Library is a local asset manager for Windows that detects these conventions automatically and builds the material for your renderer — the right suffixes, the right colour space per channel, the right normal convention — so the table above stops being your problem. The page is useful whether or not you ever install it.

Download the free edition

windows 10 / 11 · or read the roundup of alternatives