ORM textures, and Unity's mask map: the same three channels, reordered

3 min read

Every sheet in the catalogue carries the same line: “2048 textures · ORM”. Three letters, three channels, one image — and one conversion to make depending on the engine. Here is what the line covers, and what it spares you.

A PBR surface needs three values, each of which is only one number per pixel: how much ambient light this crevice receives, whether this area is smooth or rough, whether it is metal. Three greyscale maps — and a greyscale image wastes two thirds of what it could carry.

A colour image has three channels. Put one map in each. That is all ORM means.

What each letter takes

R — Occlusion
Contact shadow: the ambient light that crevices, folds and joints steal from each other.
G — Roughness
0 is a mirror, 1 is chalk. This is the channel doing most of the visual work.
B — Metallic
Metal or not. In practice almost always 0 or 1: intermediate values do not occur in nature, they exist for transitions.

The order is not arbitrary: it is the glTF convention, and it is why a .glb loaded into Three.js arrives textured with nothing to set.

What it saves, in numbers

Three separate 2K maps means three files, three texture slots and three samples per pixel in the shader. Packed, it is one file, one slot, one sample. The saving is threefold:

  • memory — a 2048 RGB image weighs what ONE of the three maps would, and replaces all three;
  • shading time — texture sampling is among the costlier operations in a shader, and two of three are removed;
  • budget headroom — in a scene instancing forty busts, it is the texture slot count, not the triangle count, that breaks first.

What each engine expects, exactly

This is where the glTF convention stops being universal, and where most imports stall.

glTF · Three.js · React Three Fiber
Reads ORM as it stands. Nothing to do.
Unreal Engine
Expects R = occlusion, G = roughness, B = metallic. That is ORM, same order. Nothing to do either.
Unity URP · Lit material
Expects metallic in RED and SMOOTHNESS in alpha. Smoothness is the inverse of roughness.
Unity HDRP · mask map
Another order again: metallic in red, occlusion in green, detail mask in blue, smoothness in alpha.

For Unity the conversion is two moves: reorder the channels, and invert roughness once to get smoothness. A separate-channels node in Blender, or any image editor, will do. The delivered .blend holds the original set unflattened — that is what the source file is for, and it makes conversion possible instead of repainting.

The full Unity crossing, scale and axes included, is in this note.

Why 2K, and not 4K

Because a texture only has useful resolution relative to how large the piece sits on screen. A bust seen at three metres down a corridor occupies a hundred pixels of height: a 4K map lays down sixteen times more information than the screen can show, and the graphics card loads it anyway.

An 8K takes four times the memory of a 4K, which takes four times a 2K. Across a scene carrying forty pieces the arithmetic shows immediately — and it shows first on the player whose card has eight gigabytes.

So the catalogue is 2K, and that is a decision rather than a saving. High resolution does exist: commissions start from an 8K sculpt, and the studio page says what it is for — close-ups and cinematics, not real time.

Each piece states its resolution on its own sheet, next to the triangle count. The catalogue is here.

Pieces mentioned

Read next

All notes