Formats and model pipelines

ORM vs MRA vs RMA Channel Packing

The letters are the channel order: ORM is R=occlusion, G=roughness, B=metallic; MRA is R=metallic, G=roughness, B=AO; RMA is R=roughness, G=metallic, B=AO. Match the destination shader—not the filename.

Intermediate Technical artistsMaterial artistsGame developers Published
ORM, MRA, and RMA channel-packed PLAYTEX AI textures with exact red, green, and blue channel assignments
Controlled PLAYTEX AI channel-packing evidence using one 512 × 512 material set.

Direct answer

What is the difference between ORM, MRA, and RMA?

Treat a packed-map suffix as a hint, then verify the shader inputs, exporter preset, or format specification. glTF, Three.js, Godot ORMMaterial3D, and Adobe’s Unreal preset use ORM; custom Unreal materials may use any wiring; Unity HDRP uses its own four-channel Mask Map.

Guide versus tool boundary: This guide owns format semantics and pipeline choice. Texture Channel Packer owns packing, swizzling, inversion, channel preview, and PNG or documented ZIP export.

What you will get

  • Read the exact R, G, B, and A contract before importing a packed material map.
  • Choose ORM, MRA, RMA, Unity HDRP Mask Map, or a documented custom mapping without guessing from a suffix.
  • Diagnose silent channel swaps by isolating each component and checking polarity, color space, and shader bindings.

Best use cases

  • An exporter produced a file ending in _orm, _mra, _rma, _arm, or _mask and the destination material looks wrong.
  • A team needs one documented packed-map convention across Unreal, Godot, glTF, Three.js, or a custom shader.
  • A material package must preserve AO, roughness, and metallic values through a lossless pack-and-split round-trip.

Acceptance test

Approve the asset only when these are true

  • The shader or format documentation agrees with the R, G, B, and A mapping.
  • AO, roughness, and metallic are imported as linear or non-color data.
  • Every channel isolate matches the intended source and polarity.
  • The manifest records mapping, constants, resizing, and inversion choices.
  • The final material has been checked under changing light in the destination renderer.

The acronym is not a file-format guarantee

PNG, WebP, TGA, and other image containers do not know that one byte means roughness and another means metallic. The renderer learns that meaning only from a material binding, shader graph, or file-format texture reference.

That is why a channel swap can remain silent: the image decodes correctly, but the shader reads valid numbers for the wrong material property. Preserve a manifest or project convention beside the packed file.

Packing and compression are separate decisions

Packing reduces texture bindings and file count; it does not guarantee lower decoded GPU memory. The runtime compression format, alpha presence, mip chain, dimensions, and platform transcode determine the stored and resident cost.

Review highly detailed masks after compression. Epic notes that channel quality can vary and that an alpha channel can increase memory, so put the most artifact-sensitive data where the target compressor preserves it best and measure the actual build.

Pack the contract, then prove it in the destination

The letters are the channel order: ORM is R=occlusion, G=roughness, B=metallic; MRA is R=metallic, G=roughness, B=AO; RMA is R=roughness, G=metallic, B=AO. Match the destination shader—not the filename.

Step 1: Load the loose scalar maps or ZIP

Add ambient occlusion, roughness, and metallic sources to Texture Channel Packer. Confirm each detected role before applying a preset.

Open Texture Channel Packer

Step 2: Choose the documented destination contract

Select ORM, MRA, RMA, glTF ORM, Unity HDRP Mask Map, or Custom. If the destination has no published contract, mirror the actual material graph and record the choice.

Step 3: Inspect red, green, and blue separately

A composite preview can hide a swap. Solo every channel and compare it with the labeled AO, roughness, or metallic source before export.

Step 4: Export linear PNG plus the manifest

Keep scalar material data out of sRGB conversion. Use the documented ZIP when the mapping, neutral constants, or resampling decisions need to travel with the file.

Step 5: Validate the imported material

Bind the exact channels, rotate the light, and run Material Preflight before the asset ships. A correct-looking RGB thumbnail is not an acceptance test.

Run Material Preflight

Which packed format does the project actually need?

Current packed-map channel contracts reviewed August 29, 2026
Target or presetRGBASelect
glTF 2.0 / Three.jsOcclusionRoughnessMetallicUnusedORM
Godot 4 ORMMaterial3DOcclusionRoughnessMetallicUnusedORM
Adobe Unreal export presetAmbient occlusionRoughnessMetallicUnusedORM
Unreal custom materialShader-definedShader-definedShader-definedOptionalMatch the graph
Unity HDRP 17 Mask MapMetallicAmbient occlusionDetail maskSmoothnessHDRP Mask Map
MRA asset or exporterMetallicRoughnessAmbient occlusionOptional / project-definedMRA
RMA asset or exporterRoughnessMetallicAmbient occlusionOptional / project-definedRMA

Common Pitfalls

  • Metal looks like chalk or plastic because the material reads AO or roughness as metallic.
  • Cavities brighten because AO polarity was inverted or the packed map was gamma-decoded as color.
  • Gloss runs backward because a smoothness source was packed without 255 − value inversion.
  • The browser preview looks plausible but the engine is wrong because the importer or shader bindings use another contract.

Are ORM, MRA, and RMA interchangeable?

No. They can contain the same three scalar maps, but those maps occupy different RGB channels. A shader that expects ORM will silently read the wrong values from an MRA or RMA texture unless you rewire or swizzle the channels.

Does Unreal Engine require ORM?

No. Unreal materials can read any channel and connect it to any mask input. ORM is a common export and project convention, including Adobe’s documented Unreal preset, but the material graph remains the final contract.

Is glTF ORM one texture or two?

glTF defines a metallicRoughnessTexture that reads roughness from green and metallic from blue, plus an occlusionTexture that reads red. Both bindings may reference the same image when the UV coordinates match, producing the familiar ORM file.

Should a packed material texture use sRGB?

Normally no. AO, roughness, metallic, smoothness, and masks are scalar data. Import the packed texture as linear or non-color data unless the destination specification explicitly says otherwise.

Do I need separate MRA and RMA tools?

No. Use presets in one general Texture Channel Packer, or define a custom R/G/B mapping. Keep the fixed ORM Texture Packer for the fast legacy ORM job and use PBR Engine Converter when you need a complete target-specific material package.

Primary sources

Official specifications and renderer documentation

PLAYTEX AI guidance is paired with official specifications and platform documentation where the handoff depends on an outside convention.

  1. glTF 2.0 specification — Khronos Group
  2. StandardMaterial3D and ORMMaterial3D — Godot Engine
  3. Using Texture Masks — Epic Games, Unreal Engine 5.8
  4. Unreal Engine export preset — Adobe Substance 3D Sampler
  5. Mask and detail maps — Unity HDRP 17.0.4
  6. MeshStandardMaterial channel behavior — Three.js