TA logoThe Technical Artist
Home/Tools/Texture Channel Packer
tool t-07
any engine
client-side only

Texture Channel Packer

Pack AO, roughness, metallic, smoothness, and masks into one RGBA texture. One sampler instead of four, in the layouts Unreal and Unity expect. Files are read in this tab; nothing uploads.

How to use

Pick a preset if you want the common channel names, then drop maps onto the slots. Empty slots can use constants, and each slot can read luminance or a specific source channel. Tick invert for roughness-to-smoothness style swaps, check the channel previews, then download the packed PNG.

Why Pack Channels?

A texture sample costs the same whether you use one channel or four. Shipping ambient occlusion, roughness, and metallic as three separate grayscale textures means three samplers, three fetches, and three times the memory of one packed map. Packing them into R, G, and B of a single texture is standard practice in every production pipeline - Unreal's material templates expect an ORM texture, Unity HDRP is built around the Mask Map.

Grayscale data should also be packed linear (sRGB off) in the engine - remember to untick sRGB when you import the packed texture, or your roughness values will be silently gamma-shifted.

The Presets

PresetRGBA
Unreal ORMAmbient occlusionRoughnessMetallic-
Unity HDRP MaskMetallicAmbient occlusionDetail maskSmoothness
Unity Metallic + SmoothnessMetallic--Smoothness

Presets only relabel the slots and set sensible constants for empty ones (AO defaults to white, everything else to black) - they never touch your images. Coming from a PBR bake with roughness but targeting Unity's smoothness? Drop the roughness map in the A slot and tick inv - smoothness is just inverted roughness.

Empty slots export as their constant value, so you can pack a two-map texture (say metallic + smoothness) without hunting for filler images.

The Alpha Gotcha

Browsers store canvas pixels with premultiplied alpha - if this tool exported via the canvas like most web packers do, any pixel with a dark alpha value would corrupt the RGB data underneath it (a roughness of 0.1 in alpha would quantize your AO/rough/metal values into a handful of steps). This tool sidesteps the problem entirely: the packed pixels never round-trip through a canvas - the PNG is encoded directly from the raw channel data in JavaScript, so what you pack is bit-for-bit what you get.

Privacy

This runs as plain HTML and JavaScript. Dropped images are decoded in this tab, used in memory, and never sent anywhere. View source if you want to check.