Texture Channel Packing: Unreal ORM vs Unity Mask Maps
What channel packing is, the exact channel layouts for Unreal ORM, Unity URP and Unity HDRP, why Unity uses smoothness, and the import settings that matter.
Ambient occlusion, roughness and metallic maps are all greyscale. Storing each one in its own RGB texture wastes two thirds of every file. Channel packing puts each map into one channel of a single texture: one texture sample instead of three, less memory, and faster materials.
The idea is the same everywhere, but each engine expects a different layout. Get it wrong and your metal looks like plastic or your shadows end up in the roughness.
The layouts
| Engine / shader | R | G | B | A |
|---|---|---|---|---|
| Unreal Engine (ORM) | Ambient Occlusion | Roughness | Metallic | – |
| Unity URP Lit | Metallic | Occlusion | – | Smoothness |
| Unity HDRP Lit (Mask Map) | Metallic | Ambient Occlusion | Detail Mask | Smoothness |
The name ORM simply lists Unreal's channel order: Occlusion, Roughness, Metallic.
Why Unity uses smoothness
Unreal (like most tools, including Substance and Blender) uses roughness: 0 is mirror-smooth, 1 is fully rough. Unity's Lit shaders use smoothness, which is the opposite:
smoothness = 1 − roughness
So when you pack for Unity you must invert your roughness map before putting it in the alpha channel. Forget this and shiny surfaces turn matte and matte surfaces turn shiny.
Unreal Engine: using an ORM texture
- Import the packed texture.
- In the Texture Editor, set Compression Settings to Masks (no sRGB) and make sure sRGB is unticked.
- In your material, sample it once and connect:
- R → Ambient Occlusion
- G → Roughness
- B → Metallic
If you are building a material library, make a material function or master material that expects this layout, so every ORM texture plugs straight in.
Unity URP: metallic + occlusion + smoothness
- Import the texture and untick "sRGB (Color Texture)" in the import settings.
- In a URP Lit material, assign it to the Metallic Map slot.
- Keep Smoothness Source on Metallic Alpha.
- Assign the same texture to the Occlusion slot; URP reads occlusion from the green channel.
Unity HDRP: the Mask Map
- Import the texture with sRGB unticked.
- In an HDRP Lit material, assign it to Mask Map.
- HDRP reads metallic from R, AO from G, the detail mask from B and smoothness from A.
- If you do not use detail maps, fill the blue channel with white.
Packing textures in seconds
The free Texture Channel Packer has presets for all three layouts:
- Choose Unreal ORM, Unity URP or Unity HDRP.
- Drop your maps into the matching slots. Empty slots are filled with sensible defaults (for example white AO, which means "no occlusion").
- Unity presets invert roughness to smoothness automatically. Untick Invert if you already have a smoothness map.
- Maps of different sizes are resized to match.
The result preview shows each channel separately, so you can check that every map ended up where it should.
Common mistakes
- Leaving sRGB on. Packed textures hold data, not colour. With sRGB on, every value is gamma-shifted and your roughness is wrong.
- Forgetting to invert roughness for Unity.
- Using the wrong default for empty channels. AO and HDRP's detail mask should default to white; metallic usually to black.
- Compressing with a colour format that blends channels. Use the engine's mask/linear compression setting.
Summary
- Unreal ORM = AO, Roughness, Metallic in R, G, B.
- Unity URP = Metallic in R, Occlusion in G, Smoothness in A.
- Unity HDRP Mask Map = Metallic, AO, Detail Mask, Smoothness in R, G, B, A.
- Unity needs smoothness = 1 − roughness.
- Always turn sRGB off for packed textures.