twirl

What is an ORM texture? AO, roughness, and metallic packing explained

September 3, 2026·twirl

Learn what an ORM texture is, why Unreal and glTF workflows pack AO, roughness, and metallic together, and how Unity Mask Maps differ.

An ORM texture is one image carrying three grayscale material maps in its color channels: ambient occlusion in red, roughness in green, and metallic in blue.

Nothing new is being invented in the image. The maps are simply packed together so the shader can read three material properties from one texture sample instead of loading three separate grayscale files.

If you work between Unreal Engine, glTF, Godot, Unity, and texture-authoring tools, this is where things get confusing. The idea is simple. The channel order is not always the same.

What ORM stands for

ORM means Occlusion, Roughness, Metallic.

The usual layout is:

Channel Data
Red Ambient occlusion
Green Roughness
Blue Metallic

This layout matches the common glTF packing convention and is widely used in real-time workflows. Unreal materials can also use packed masks this way, although Unreal does not require you to pack the maps.

A packed ORM texture often looks strangely colored when you open it as a normal image. That is expected. Each RGB channel is carrying unrelated grayscale data, so the combined preview is not supposed to resemble the surface.

Why pack PBR maps into one texture?

Roughness, metallic, and ambient occlusion are all scalar values. Each one only needs a single grayscale channel.

Saving every map as a separate RGB image leaves most of those available channels unused. Channel packing puts the data into one file instead.

The practical benefit is mostly on the rendering side. A material can fetch one packed texture and separate its red, green, and blue channels in the shader. In large real-time scenes, reducing texture samples and keeping material inputs organized can matter.

We would not pack maps just because it makes the folder look cleaner, though. During look development, separate maps are often easier to inspect, edit, regenerate, and debug. Packing makes the most sense when the target engine or production pipeline benefits from it.

How to use an ORM texture in Unreal Engine

In Unreal, import the ORM image and open its texture settings. Disable sRGB because roughness, metallic, and occlusion are data values, not display color.

In the Material Editor, bring in the packed texture and connect the channels separately:

  • R → Ambient Occlusion
  • G → Roughness
  • B → Metallic

You can use the channel outputs directly from the Texture Sample node. There is no need to split the image into three files first.

The important part is checking the actual packing convention before wiring it. Unreal supports arbitrary channel packing. A studio may use ORM, RMA, MRA, or a custom mask layout. The filename is a clue, not proof.

Our Unreal Engine material guide covers the rest of the map setup, including base color, normals, and Unreal's DirectX normal orientation.

twirl exports separate roughness and metallic maps

twirl currently gives you separate albedo, normal, roughness, metallic, and height maps. It does not currently export a ready-made ORM texture or ambient occlusion map.

That is intentional to be clear about what you are getting. Separate roughness and metallic files work directly in Unreal, Blender, Cinema 4D, and plenty of other material systems. You only need to pack them when the target pipeline asks for it.

Before you pack channels for Unreal, it helps to see the separate roughness and metallic maps twirl exports.

Example prompt

cast iron plate, rust spots, rough matte surface

Albedo
Normal
Roughness
Metallic
Height

Albedo, normal, roughness, metallic, and height — tileable PNGs.

Loading preview…

Generate a PBR material

If an Unreal pipeline requires ORM, put the twirl roughness map in green and metallic map in blue. The red channel needs a real AO source if you have one, usually baked from the asset or produced elsewhere in the texturing pipeline.

If you have no AO data and the shader still expects the red channel, a white value represents no occlusion. Do not derive ambient occlusion by simply darkening the albedo. AO is supposed to describe reduced indirect light in crevices and sheltered areas, not dark paint or dirt.

ORM is not the same as Unity's Mask Map

This is the mistake that causes a material to look fine in one engine and wrong in another.

Unity HDRP uses a packed Mask Map, but its channels are different from ORM. A common HDRP Lit Mask Map uses metallic in red, ambient occlusion in green, a detail mask in blue, and smoothness in alpha.

That creates two differences immediately:

  1. The channels are rearranged.
  2. Unity stores smoothness where an ORM workflow stores roughness.

Smoothness is the inverse of roughness. If roughness is 0.8, the equivalent smoothness value is 0.2.

So you should not drop an Unreal-style ORM texture into a Unity Mask Map slot and expect it to work. Repack the channels for the shader you are actually using.

Our Unity material guide goes deeper on roughness-to-smoothness conversion and the differences between Unity render pipelines.

What about RMA, MRA, and other packed maps?

They are the same idea with a different channel order.

An RMA texture might mean roughness in red, metallic in green, and ambient occlusion in blue. MRA might put metallic first. Some pipelines use the alpha channel for height, opacity, smoothness, or another mask.

There is no universal rule that says every packed PBR texture must be ORM. The shader only cares that the channel containing a property is connected to the matching input.

When we get a material from an unfamiliar source, we check the documentation or inspect each channel in grayscale before connecting anything. It takes a few seconds and avoids trying to fix a "bad roughness map" that was actually metallic data in the wrong socket.

Keep packed maps out of sRGB

Packed mask textures should normally be treated as linear data.

sRGB decoding changes numerical values because it assumes the texture represents visible color. That is correct for base color. It is wrong for a roughness value that is supposed to remain exactly the value stored in the image.

The same rule applies to standalone roughness, metallic, height, and most other PBR data maps. Base color is usually the exception because it represents color intended for display.

If an ORM material suddenly looks too glossy, too matte, or oddly metallic, checking sRGB is one of the first things we do after verifying the channel order.

Do you actually need an ORM texture?

Not always.

For Blender look development, separate maps are usually simpler. For a small Unreal project, separate roughness and metallic textures may be completely fine. For a production game with lots of materials, channel packing can make the shader and texture budget more efficient.

We think the useful distinction is between the material data and the delivery format. Roughness is roughness whether it lives in its own PNG or the green channel of an ORM image. Metallic does not become different material data because it moved into blue.

Keep the source maps clear while you are working. Pack them for the target engine when the pipeline benefits from it.

If you are starting from a generated material, twirl creates the core PBR maps from a text prompt. Download the separate maps, validate the material first, then pack the channels your final engine expects.

What to do next

Try it

Generate a PBR material

Type a surface and get tileable albedo, normal, roughness, metallic, and height maps. Five free generations a day.

Open twirl
Read next

How to Turn an Image Into a Seamless Texture

Turn a photo or image into a seamless, tileable texture for Blender, Unreal, Unity, and other 3D workflows.

Continue reading
twirl

© 2026 twirlTerms·Privacy