How to pack texture channels
- 1
Drop your maps
Add AO, roughness, metallic, smoothness, height or any grayscale mask as PNG, JPG or WebP. Names like _ao, _rough and _metal set each map's type; change it if a guess is wrong.
- 2
Pick a layout
glTF / Unreal ORM, Unity HDRP Mask Map, Unity URP / Built-in, or Custom. Missing maps get a constant value you can set, and any channel can be inverted.
- 3
Download the PNG
Check the preview and the four channel thumbnails, then save the PNG. In your engine, mark it as non-colour data (sRGB off).
Why ORM and mask maps save memory and samplers
One texture instead of three
Saved as separate RGB images, each grayscale map repeats the same value in all three channels. Packed, those channels carry three different maps, so you load, store and stream one texture where you had three.
Fewer texture samples
The shader reads one texture once and gets AO, roughness and metallic together. Epic's Unreal Engine docs call channel packing a good way to improve material performance by reducing the number of texture samples.
Fewer sampler slots
GPUs and engines give a material a limited number of texture slots. One packed map leaves room for detail maps, masks and decals.
Built into the formats
glTF 2.0 reads occlusion from red and roughness and metallic from green and blue, so its occlusion and metallic-roughness slots can point to the same ORM image. Unity's HDRP and URP Lit shaders read their own packed layouts.
Channel layouts in this tool
| Layout | R | G | B | A | Used by |
|---|---|---|---|---|---|
| glTF / Unreal ORM | Ambient occlusion | Roughness | Metallic | not used (RGB PNG) | glTF 2.0 (Blender, three.js, Godot, Babylon.js), Unreal Engine |
| Unity HDRP Mask Map | Metallic | Ambient occlusion | Detail mask | Smoothness | Unity HDRP Lit shader, Mask Map slot |
| Unity URP / Built-in Metallic | Metallic | Occlusion (URP) | not used | Smoothness | Unity URP Lit (Metallic and Occlusion slots), Built-in Standard (Metallic slot reads R and A) |
| Custom | any map | any map | any map | any map or none | Your own shader or engine |
Sources: glTF 2.0 specification (Khronos) · Unity HDRP: Mask and detail maps · Unity URP: channel-packed texture · Unity Built-in: Metallic mode · Unreal Engine glTF packing flags
Smoothness vs roughness
Roughness and smoothness describe the same thing from opposite ends. In a roughness map, black (0) is a mirror-smooth surface and white (1) is fully rough; glTF, Unreal Engine and Blender use roughness. Unity's Lit shaders use smoothness, where white is smooth and black is rough.
So smoothness = 1 - roughness, or 255 - roughness for 8-bit values. When you pick a Unity layout and drop a roughness map, this tool inverts it into the alpha channel for you. When you drop a smoothness or gloss map, it goes in as it is. Going the other way, unpack a Unity mask map and tick Invert on the alpha channel to save a roughness map.
Related tools
- AI 3D Texturing StudioMake the maps with AI: paint a 3D model and build its normal, roughness, metal and AO maps.
- Normal Map GeneratorTurn a photo or texture into a normal map.
- GLB Texture ExtractorPull the textures, including the ORM image, out of a GLB file.
- Free PBR TexturesSeamless textures with their maps, ready to pack.
- PBR maps explainedWhat each map does and how glTF stores it.