The PBR Texture Workflow: Prompt to Production
PBR · 11 min read
A PBR material is a set of maps that describe a surface independently of the light hitting it. Each channel answers one question. When those answers come from the same underlying height field, the material reads as a real surface instead of a collection of unrelated images.
The five channels
Albedo is the base colour with no lighting baked in. Normal is tangent-space direction data describing surface bumps. Roughness describes how scattered the reflection is. Ambient occlusion describes contact darkening in creases. Height describes actual depth.
The important detail is that normal, roughness, AO and height here are all derived from one height field. That is why the normal map lines up with the colour in the albedo, and why the AO darkens exactly the gaps you can see.
- Albedo / BaseColor - pure colour, no lighting.
- Normal - tangent-space normals for bump response.
- Roughness - 0 is a mirror, 1 is fully diffuse.
- AO - baked contact shadowing in creases and gaps.
- Height / Displacement - real depth for parallax or displacement.
Roughness is the channel people get wrong
Roughness is the fastest way to make a material look fake, because default values are usually wrong for the surface. A brick wall should be rough everywhere. A glazed ceramic tile should be smooth on the face and rougher in the grout. Metal should be smooth but not perfect.
If a surface has both raised and recessed areas, the roughness map should vary with them. Deriving roughness from the same height field that produced the normal map is the simplest way to keep that relationship believable.
Connecting the maps in an engine
In Unity URP, assign albedo to Base Map, the normal map to Normal Map, and the roughness value to Smoothness with an inversion if your pipeline expects it. Unreal Engine 5 uses the same convention with a Material Instance. Blender uses separate sockets on the Principled BSDF.
Unity URP
Base Map <- albedo.png
Normal Map <- normal.png (Normal Map checkbox ON)
Smoothness <- 1 - roughness.png (or use a Mask Map)
Occlusion <- ao.png (Occlusion checkbox ON)
Blender Principled BSDF
Base Color <- albedo.png
Normal <- normal.png
Roughness <- roughness.png
Ambient Occlusion <- ao.pngKeeping files aligned
Every map in a pack must be exported at exactly the same resolution, or the bumps will drift away from the colour detail. If you rescale one map, rescale all of them.
Try it on your own material
Generate a seamless PBR texture pack free in your browser. No upload, no watermark.
Open the generator