Channel packing (ORM)
Storing several greyscale maps in the red, green, blue and alpha channels of one texture, such as occlusion, roughness and metallic (ORM). Covers the common layouts in Unreal, Unity (HDRP mask map, URP) and Godot, import settings, and the trade-offs.
Channel packing means storing several greyscale maps in the separate red, green, blue (and sometimes alpha) channels of one texture. The best-known layout is ORM: occlusion in red, roughness in green, metallic in blue. World of Level Design calls the same Unreal layout ARM: ambient occlusion, roughness, metallic (World of Level Design: How to Export Substance Painter Textures and…).
#Why pack
Most PBR maps are greyscale: ambient occlusion, roughness, metallic, height, masks. Storing each as a full RGB texture wastes two thirds of it. Packing three or four into one texture means fewer files, fewer texture samples in the shader and less memory. Godot calls its ORM texture "a more efficient replacement" for separate occlusion, roughness and metallic textures (Godot Engine: BaseMaterial3D).
Adobe's Unreal export preset is described as packing textures "with the lowest possible memory footprint" (Substance 3D Painter documentation: Default Output templates).
#Common layouts
| Engine or format | R | G | B | A | Source |
|---|---|---|---|---|---|
| Unreal Engine (usual ORM convention) | Occlusion | Roughness | Metallic | free | World of Level Design (World of Level Design) |
| Godot ORMMaterial3D | Occlusion | Roughness | Metallic | ignored | Godot class reference (Godot Engine) |
| glTF 2.0 | Occlusion | Roughness | Metallic | ignored | glTF spec (Khronos Group) |
| Unity HDRP mask map | Metallic | Occlusion | Detail mask | Smoothness | Unity HDRP manual (High Definition Render Pipeline manual 17.0) |
| Unity URP Lit | Metallic | Occlusion (if the same texture is also set as Occlusion Map) | unused | Smoothness ("Metallic Alpha") | Unity URP manual and shader source (Unity Manual; Unity Graphics repository) |
Notes on each engine and format:
- Unreal has no fixed layout. A material can read any channel; ORM is the layout that Substance 3D Painter's Unreal export produces (World of Level Design: How to Export Substance Painter Textures and…).
- glTF defines the layout so that one image can serve both the occlusion and metallic-roughness slots: occlusion uses only red, metallic-roughness only green and blue, so the two "could point to the same texture" (Khronos Group: glTF 2.0 Specification).
- Godot ORMMaterial3D reads the ORM texture directly; Godot's docs note that Substance Painter and ArmorPaint export it with their Unreal preset (Godot documentation: Standard Material 3D and ORM Material 3D). StandardMaterial3D also lets you choose which channel each map is read from (Godot Engine: BaseMaterial3D).
- Unity HDRP stores smoothness, so invert roughness before packing (High Definition Render Pipeline manual 17.0: Mask map and detail map).
- Unity URP reads smoothness from the alpha of the metallic map by default, or from the base map's alpha; "You can use a single RGBA texture for the metallic, smoothness, and occlusion properties" (Unity Manual: Lit shader material Inspector window…). The shader reads metallic from red and occlusion from green (Unity Graphics repository: LitInput.hlsl).
#Import settings
Packed textures hold data, not colour, so import them as linear:
- Unreal: turn sRGB off; World of Level Design calls this "very important to do" (World of Level Design: How to Export Substance Painter Textures and…). The Masks compression setting exists for this and "will disable sRGB as texture masks should not be gamma corrected" (Unreal Engine documentation: Texture Compression Settings).
- Unity: for the HDRP mask map, "disable sRGB (Color Texture)" in the importer (High Definition Render Pipeline manual 17.0: Mask map and detail map).
- glTF: the metallic-roughness texture "MUST be encoded with the linear transfer function" (Khronos Group: glTF 2.0 Specification).
#Example
#Trade-offs
- Compression shares bits. Block compression formats share some data between channels; Nathan Reed notes BC1 uses only "5:6:5" bits for its colour endpoints, so packed channels lose a little precision compared with separate single-channel formats (Nathan Reed's coding blog: Understanding BCn Texture Compression Formats). Most masks tolerate it; height maps and smooth gradients may not. See texture formats, compression and mipmaps.
- Alpha is expensive. Adding an alpha channel often moves a texture from a 4-bit-per-pixel format (BC1) to an 8-bit one (BC3 or BC7), doubling its memory (Nathan Reed's coding blog: Understanding BCn Texture Compression Formats).
- One resolution for all. Every packed map shares the same size and UVs, even if one of them would be fine at half resolution.
- Engine lock-in. An ORM texture is wrong in Unity HDRP and vice versa. Keep your source files and export per engine.
#Common mistakes
- sRGB left on for a packed texture (World of Level Design: How to Export Substance Painter Textures and…).
- Wrong channel order for the target engine, typically ORM used as a Unity mask map.
- Roughness not inverted for Unity's smoothness.
- Packing the normal map into a mask texture without understanding the precision cost.
#Related terms
texture maps explained · texture formats, compression and mipmaps · roughness map · metallic map · ambient occlusion · master materials and instances · shaders for artists
#Further reading and watching
References
- · How to Export Substance Painter Textures and Import into UE5 · World of Level Design, 2024 · article · accessed 2026-10-21
- · BaseMaterial3D (class reference source) · Godot Engine (GitHub) · docs · accessed 2026-10-21
- · Default Output templates (export presets) · Substance 3D Painter documentation · docs · accessed 2026-10-21
- · glTF 2.0 Specification · Khronos Group (GitHub) · docs · accessed 2026-10-21
- · Mask map and detail map (HDRP) · High Definition Render Pipeline manual 17.0 · docs · accessed 2026-10-21
- · Lit shader material Inspector window reference for URP · Unity Manual (6000.2) · docs · accessed 2026-10-21
- · LitInput.hlsl (URP Lit shader source) · Unity Graphics repository (GitHub) · docs · accessed 2026-10-21
- · Standard Material 3D and ORM Material 3D (documentation source) · Godot documentation (GitHub) · docs · accessed 2026-10-21
- · Texture Compression Settings (Unreal Engine 4.27) · Unreal Engine documentation, 2021 · docs · accessed 2026-10-21
- · Understanding BCn Texture Compression Formats · Nathan Reed's coding blog, 2012 · article · accessed 2026-10-21
- · Your Textures Are Killing Performance, Here's Why · YouTube, 2026 · video · accessed 2026-10-21
Also consulted
- · Advanced Channel Packing – Shader Graph Basics – Episode 23 · YouTube, 2021 · video · accessed 2026-10-21
Pages that link here
- Vertex colours Key term
- glTF Key term
- Texture file formats Reference
- A free and open-source pipeline Guide
- Texturing and material software Reference
- Baking Topic
- Physically based rendering (PBR) Topic
- Colour space: sRGB and linear Key term
- Texture maps explained Reference
- Roughness map Key term
- Metallic map Key term
- Ambient occlusion Key term
- Texture formats, compression and mipmaps Topic
- Texture streaming Key term
- Unique texturing (texture painting) Topic
- Decals Topic
- Mesh decals Topic
- Detail maps and macro variation Topic
- Material layers and Substrate Topic
- Terrain layers and splat maps Key term
- Foliage and vegetation Topic
- Texture memory (VRAM) Key term
- The technical artist Topic
- Naming conventions Reference
- Exercise: your first game-ready prop Exercise
- Exercise: a trim sheet Exercise
- Essential talks and videos Reference
- Game art breakdowns: a curated library Reference
Last updated 2026-10-22