A PBR material is a small agreement between images and a shader. The base-color file cannot decide to become roughness halfway through import, and a packed texture is meaningless until someone states which channel holds what.
This reference uses the common metallic-roughness workflow. Other workflows exist, so treat the target shader as the contract.
The map reference
| Map | What it controls | Typical treatment | Common mistake |
| Base color / albedo | Surface color or reflectance tint | sRGB color | Baked shadows and highlights |
| Normal | Per-pixel surface direction | Linear data; normal compression | Wrong green-channel orientation |
| Roughness | Spread of reflected light | Linear grayscale data | Using brightness as roughness |
| Metallic | Metal versus dielectric classification | Linear mask, mostly 0 or 1 | Gray noise on ordinary materials |
| Ambient occlusion | Small-scale indirect-light reduction | Linear grayscale data | Painting heavy permanent shadows |
| Height / displacement | Relative surface elevation | Linear data, sometimes higher bit depth | Assuming every dark pixel is low |
| Opacity | Visibility or cutout coverage | Linear mask or alpha channel | Confusing blend and cutout behavior |
| Emission | Self-lit color or mask | Color or mask plus intensity | Baking the surrounding glow into base color |
Base color is not a photograph
Base color records the material's visible color without scene lighting baked into it. Roblox's PBR documentation draws a useful distinction: diffuse images often include shading that is better produced by normal, roughness, and metalness behavior. Unreal similarly defines Base Color as the material's overall color and provides measured reference ranges for several materials.
Remove cast shadows and specular highlights from a photo-derived base color. Keep real pigment, stains, paint, and the characteristic tint of a metal.
Normal maps bend light, not geometry
A tangent-space normal map stores XYZ directions in RGB. It creates the lighting response of scratches, pores, grooves, and small bevels without changing the silhouette. A flat tangent-space value is near RGB 128,128,255.
Normal data should not receive ordinary color correction. Mark it as a normal map or Non-Color data in the destination tool. If raised details become dents, check the green-channel convention before rebuilding the map.
Roughness controls reflection shape
Low roughness produces a tight, clear reflection. High roughness spreads the reflection into a broad, soft response. Roughness does not simply mean dark, old, or dirty. A black rubber surface can be rough; a white ceramic tile can be smooth.
Some shaders ask for smoothness or gloss instead. Those are inverse concepts. Confirm whether the engine expects roughness directly, smoothness, or a value packed into another map's alpha channel.
Metallic is a material class
In a metallic-roughness workflow, clean metal regions are near 1 and dielectric regions such as wood, stone, plastic, paint, and dirt are near 0. Intermediate values can describe mixed pixels at transitions, thin grime, or antialiasing, but broad mid-gray noise often creates implausible response.
Painted metal usually has non-metal paint over metal. Let scratches reveal the metal rather than making the whole painted area half-metal.
AO should whisper
Ambient occlusion can reduce indirect light in small creases. It should not become a second set of dramatic shadows. Heavy AO locks one lighting assumption into the material and can make corners look dirty even in bright indirect light.
Some engines apply AO through a dedicated input; others pack it with roughness and metallic. If the shader already calculates strong real-time occlusion, compare the material with the texture AO reduced.
Height can mean several rendering costs
A height map is scalar elevation. It can feed a normal conversion, parallax technique, tessellation/displacement path, or offline geometry operation. Each use has a different performance and quality profile. Simply exporting a height file does not make the engine move vertices.
Use higher bit depth when smooth displacement gradients reveal banding. For shallow real-time detail, a normal map may be cheaper and more stable.
Color space is part of the data
Base color and colored emission are usually authored as display color and sampled with the expected color conversion. Normal, roughness, metallic, AO, height, and masks are numeric data. Blender's color-management guide explicitly says normal and displacement images should be marked Non-Color so no color-space conversion changes their values.
Packed maps need labels
glTF packs occlusion separately but defines roughness in the green channel and metallic in blue for its metallic-roughness texture. Unreal projects often use an ORM pattern: occlusion in red, roughness in green, metallic in blue. Unity shaders may pack smoothness into alpha. These are conventions, not universal laws.
Write the layout into the preset name and documentation. A file named wall_masks.png is a future bug. A file named wall_orm.png plus a documented ORM contract is a usable asset.
When a material looks wrong, inspect one map at a time and ask what the shader thinks that value means. PBR debugging becomes much less mystical once every file has only one honest job.