Skip to content
Normalforge

Normal maps and PBR textures in your browser

ORM Texture Packer

Pack ambient occlusion, roughness and metallic maps into one texture for glTF, Unreal or the Unity HDRP mask map.

Free · runs in your browser · nothing is uploaded

Open on Normalforge

This embed was switched off for this website. Open on Normalforge

Add this tool to your siteFree embed code, no sign-up. Keep the credit link.

Embed this tool

Copy this code into your website, blog or class page. The tool runs inside your page.

Optional settings, added to the address after embed=1: &accent=0f6b5c (colour, 3 or 6 hex digits). Other parameters are ignored.

Please keep the credit link below the tool.

An ORM texture packer stores three grey material maps as the colour channels of one image: ambient occlusion in red, roughness in green and metallic in blue. One file then does the work of three, which saves texture samples, memory and file juggling. This packer offers five layouts, ORM, ARM, MRAO, RMA and the Unity HDRP mask map with smoothness in alpha, fills any missing map with a value you set, inverts gloss input automatically where a layout needs smoothness, and resamples maps of different sizes to one output size. The table below lists which layout each engine or format expects, with the exact source we checked, so the channels land where your material reads them.
Orm texture packer example

How to use the ORM Texture Packer

  1. Drop your maps all at once or press Choose maps. Files whose names contain ao or occlusion, rough, gloss or smooth, and metal are sorted into Ambient occlusion, Roughness (or ORM) and Metallic; a fourth slot, Detail mask / extra, is used by the Unity mask layout. Try a sample loads a brick AO, roughness and metallic set.
  2. Choose a Layout: ORM (default), ARM, MRAO, RMA or Unity HDRP mask.
  3. Choose an Output size: Largest input (default), or 512, 1024, 2048 or 4096 px square. Inputs of other sizes are resampled.
  4. Tick Input is glossiness or smoothness if your roughness slot holds a gloss map.
  5. For each empty slot, set its fill value: AO if no map (default 1, no occlusion), Roughness value (default 1) and Metallic value (default 0).
  6. Check the channel layout in the stats line, look at the material on the 3D sphere, and press Download Packed map.

The packed file must be imported as data: turn sRGB off in your engine, or the green and blue values shift and the material looks wrong. Keep the original maps too; it is easier to repack them for another layout than to unpack a packed file.

Switch Show in the 3D preview to AO only, Roughness only or Metallic only: each view reads its channel back out of the packed result, so you can confirm that every map ended up in the right place before you download.

Which channel layout does my engine expect?

glTF 2.0 reads occlusion from red, roughness from green and metalness from blue, so one ORM texture can feed both slots. Unity HDRP’s mask map uses red for metallic, green for occlusion, blue for a detail mask and alpha for smoothness. ORM or ARM is also a common packed setup in Unreal Engine materials. Match the layout to the material that will read the file.

LayoutRGBASource we checked
ORM / ARMAOroughnessmetallic–glTF 2.0 specification, sections 5.19.6 and 5.22.5
Unity HDRP maskmetallicAOdetail masksmoothnessUnity HDRP manual, “Mask map and detail map”
same file in Unity URP LitmetallicAOunusedsmoothnessUnity 6 URP manual, “Assign a channel-packed texture to a material”
MRAOmetallicroughnessAO–PBR shader documentation for Source-engine games
RMAroughnessmetallicAO–no official source; offered for pipelines that use it

In Unreal Engine the ORM texture is a convention you wire up in your own material, not a format the engine requires; Epic’s documentation describes the separate inputs, and the packed texture should be imported with sRGB off. Godot’s ORMMaterial3D also takes one ORM texture. Unity does not read an ORM texture in any pipeline. URP’s Lit shader reads a channel-packed texture with metallic in red, occlusion in green and smoothness in alpha (blue unused), which is the Unity HDRP mask output: assign it to both Metallic Map and Occlusion Map and keep Smoothness Source at Metallic Alpha (Unity 6 URP manual).

What is channel packing and what can be packed?

Channel packing stores separate grey maps in the colour channels of one image. Any linear grey data can be packed: AO, roughness, smoothness, metallic, height, masks. Colour maps cannot, and normal maps need their channels for themselves. All packed maps here are linear data, never sRGB.

Why pack at all?

A material that reads AO, roughness and metallic from three separate grey textures makes three texture samples per pixel and keeps three files in memory, each with its own mipmaps. Packed, it is one sample and one file. Grey data fits a single channel without loss, so nothing is given up as long as the file stays linear and is not compressed with a format that blurs channels into each other.

What does a fill value do?

It writes one constant into a channel when there is no map for it. AO 1 means no occlusion anywhere, metallic 0 means no metal, and roughness 1 means fully matte. For the Unity mask, the alpha channel is filled with 1 − Roughness value, so the default gives smoothness 0.

Questions and answers

What is an ORM texture?

A single texture whose red channel is AO, green is roughness and blue is metallic. ARM is the same order under another name.

Should an ORM texture use sRGB?

No. Each channel is data, and sRGB decoding would change the values. Import it as linear.

What happens when a channel is missing?

It is filled with the slider value for that map: AO 1, roughness 1 and metallic 0 by default. A missing detail mask in the Unity layout is 1.

Can I pack a smoothness map into green?

Green holds roughness in the ORM layout. Load the smoothness map into the Roughness (or ORM) slot with that slot’s own button and tick Input is glossiness or smoothness; it is inverted to roughness first. Dropped files with “smooth” or “gloss” in the name go to this slot and tick the box for you. For the Unity mask, roughness is turned into smoothness for alpha automatically.

Do the input maps need the same size?

No. Every input is resampled to the output size; for the cleanest result, use maps made at the same resolution.

Can I unpack an ORM texture again?

Yes, with the Texture Channel Splitter, which saves each channel as its own grey image.