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:
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 - Lowercase throughout. Windows does not care about case; scripts, render farms and Linux boxes do.
- Underscores between tokens, never spaces or hyphens. Hyphens get interpreted as minus signs by more software than you would expect.
- Channel suffix as the last token before the resolution, so grouping by stem works.
- State the normal convention in the name when you have both. Future you will not remember.
- Keep the resolution token in one format.
4k,4Kand4096in the same library is three conventions.
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