PBR texture packing stores several grayscale maps in the red, green, and blue channels of one image. Engines sample once instead of three times, which matters in real-time and in scenes with hundreds of materials. This guide covers common layouts, how to unpack in Blender, and when separate files are still the smarter choice.
Why packing exists
Albedo needs RGB color and sRGB. Roughness, metalness, and ambient occlusion are single-channel and linear. Putting those three into one RGB file saves memory and sampler slots. Normals stay in their own texture (they need three channels of vector data). Height or displacement often stays separate too, because you may not use it in-game. If the slots are new to you, read the complete PBR textures guide before you merge anything.
Common channel layouts
Unreal’s frequent convention is ORM: R = ambient occlusion, G = roughness, B = metallic. Some studios use R = roughness, G = metallic, B = AO—document yours in the project wiki. Unity HDRP can use mask maps with its own channel order; do not assume ORM. A fourth channel (alpha) can hold cavity or an extra mask, but many compressors treat alpha differently, so test. Never pack albedo into the same file as roughness: you would be forced into one color space and one compression setting for both.
- Keep albedo (sRGB) and normal (linear) as their own files.
- Pack only linear grayscale data together.
- Use PNG or TGA for the packed map; avoid JPEG banding on roughness.
Unpack in Blender, pack in the engine
Locker3d gives you separate maps. In Blender, that is ideal: Image Texture (Non-Color) → Roughness, another → Metallic. If you receive an ORM from a game export, add a Separate Color node and route R/G/B to AO, Roughness, and Metallic as labeled. Multiply AO with Base Color only if you want it in the beauty pass. Full node order is in how to apply PBR textures in Blender. To create an ORM, composite the three grayscales in an image editor or a Blender Compositor file, then save one RGB PNG. Confirm the green channel is roughness if you target Unreal.
When packing helps—and when it hurts
Pack when you have a texture budget (mobile, VR, huge Unreal levels) or when the engine’s material function expects a mask map. Do not pack during look-dev: swapping one roughness file is faster than rebuilding a composite. Do not pack maps you still author (you will recompress every tweak). Offline archviz in Cycles often gains nothing; disk is cheap and separate 4K files are easier to color-correct. If you tile packed maps, every channel must wrap; see how to tile textures without seams.
CC0 sources and a clean pipeline
Pull source maps from the Locker3d catalog—metal, concrete, wood. They are CC0, so packing and redistributing inside your game build is allowed; you still cannot claim you own the original scans. Details: CC0 textures: what you can and cannot do. More pipeline notes are on the blog.
Compression is the silent packer. BC1/DXT1 on an ORM map will smear roughness into metalness and you will get sparkling metal on concrete. Use BC7 or an uncompressed linear format for packed masks in the final build, or at least a format that keeps channels independent. Do not generate mipmaps with sRGB on a packed texture. After packing, render a chrome sphere and a matte concrete next to each other using the same ORM file: if concrete picks up metal flecks, the metallic channel leaked. Document the channel order in the material comment so the next artist does not swap G and B six months later.
Frequently asked questions
What is ORM packing?
ORM stores ambient occlusion in R, roughness in G, and metalness (or metallic) in B. One RGB texture replaces three grayscale maps and cuts sampler count.
Should I pack textures while I am still look-devving?
No. Keep separate maps until the material is approved. Pack for the game build or a heavy scene, not for the first Blender test.
Do Locker3d downloads come packed?
Locker3d ships separate CC0 maps so any engine can read them. You can pack them in your pipeline when you need the budget.