ATAITexture

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.png

Keeping 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