Channel packing: three maps in one texture

Greyscale maps waste two thirds of an RGB texture. Packing them together is standard practice and a common source of confusion.

An RGB texture has three channels. A roughness map is greyscale and uses one, wasting the other two. Packing puts three greyscale maps into a single image.

The common packing

ORM — Occlusion in red, Roughness in green, Metallic in blue. Widely used and what many engine presets expect.

Other arrangements exist, and the arrangement is a convention rather than a standard, which is exactly why it causes trouble: a texture packed for one engine looks wrong in another until the material is rewired.

What it saves

  • Texture count. One sampler instead of three, which matters because sampler count is a real shader cost.
  • Memory. Three greyscale textures stored as RGB each waste two channels; one packed texture does not.
  • Draw setup. Fewer textures to bind.

What to watch

  • Colour space. Packed data maps must be linear, never sRGB. Gamma-correcting a roughness value is silently wrong everywhere.
  • Compression. Block compression can introduce cross-channel artefacts. Some formats compress channels independently and some do not, and packing a normal map's components alongside unrelated data is where this bites.
  • Documentation. A packed texture is unreadable without knowing the convention. Encode it in the filename — the suffix is the documentation.

Normal maps stay separate

Normals need two or three channels of their own and specific compression. They are not packed with other data in most pipelines.

For generated assets

Generated textures arrive as separate maps if they arrive at all — usually just base colour. Packing is something you do when authoring the remaining channels, at export from a texturing tool, using the preset for your target engine.