TA logoThe Technical Artist
Home/Tools/PBR Map Generator
tool t-13
any engine
client-side only

PBR Map Generator

Drop in one source image and derive a starter material - base color, height, normal, roughness, AO, and a packed ORM/mask map - then preview it lit before you export. It's a fast first pass, not a physical scan: roughness and AO are honest approximations. Everything runs in this tab; no image ever uploads.

How to use

1. Drop a texture in (or load the sample). 2. Tell the tool what it is - a base-color photo, a height map, or a utility grayscale. 3. Tune Height first, since Normal and AO derive from it. 4. Shape Roughness and AO, pick a packing preset for your engine, and eyeball the Material tab. 5. Tick the maps you want and Export - individual PNGs or a ZIP with settings, metadata, and engine import notes.

Source & global
Height
Normal
Roughness
Roughness from one color image is a starting point. Check it in-engine.
Ambient occlusion
Cavity-style approximation, not baked lighting.
Packing
Export
no image loaded

Base

min - . max - . mean -
Channel view
hover the preview to probe pixels
src - preview - export - mem - idle rebuild - Local only. No image data is uploaded.

What It Can (And Can't) Do

This is a material starter, not a physical scanner. From one image it can derive maps that read plausibly - but be honest about what's real. Height is a genuine luminance-to-elevation guess. Normal is exact math on that height. Roughness and AO are approximations: roughness is inferred from brightness or surface detail (a real roughness map needs a scan or hand authoring), and AO here is a cavity trick derived from height, not baked lighting. Metallic can't be recovered from a photo at all, so it ships as a constant you set. Treat every derived map as a first pass to refine in-engine or in Substance.

Why Tune Height First

The processing graph fans out from height: Normal reads its slopes, AO reads its cavities, and one roughness mode reads its detail. So the workflow the tool nudges you toward - Import -> Height -> Normal -> Roughness -> AO -> Pack -> Export - isn't arbitrary. If height is mushy or low-contrast, everything downstream inherits the mush. Get the black/white points and a touch of sharpen right first, and the derived maps snap into focus. Changing height re-derives the maps that depend on it automatically; changing, say, roughness only rebuilds roughness and the packed map, so tuning stays fast.

Color Vs Data Textures

The single most common import mistake is treating a data map as color. Base color is the only sRGB (color) texture here - everything else is data and must import as linear / non-color, or your engine will gamma-shift the numbers and quietly wreck your lighting. Normal maps especially must never be gamma corrected. The exported metadata JSON and import-notes file spell out which is which, so you (or a teammate) can't get it wrong later. If any of this is fuzzy, the texture formats cheat sheet and the shader debugging guide cover the sRGB trap in detail.

The Packing Presets

Shipping AO, roughness, and metallic as three separate grayscale textures wastes memory and samplers. Packing them into one texture's channels is standard - and every engine wants a slightly different arrangement. Unreal ORM and glTF use R=AO, G=Roughness, B=Metallic. Unity HDRP's mask map is R=Metallic, G=AO, B=Detail, A=Smoothness - note the Smoothness, which is inverted roughness; the tool flips it for you and says so. When a preset packs smoothness, the channel dropdown shows it explicitly. Need something bespoke? Switch to Custom and assign each channel by hand. This pairs naturally with the dedicated Channel Packer if you're combining maps from elsewhere.

Privacy

This runs as plain HTML and JavaScript. Your image is decoded, processed, and exported inside this browser tab. It is not sent anywhere, and nothing is kept between sessions. Close the tab and it is gone.