What Ambient Occlusion Is
Ambient Occlusion (AO) is a shading technique that simulates how ambient light is blocked in crevices, corners, and tight spaces. In a brick wall, the mortar joints are darker because less ambient light reaches those recessed areas. An AO map is a grayscale texture where white means fully exposed to ambient light and black means fully occluded. It adds depth and grounding to materials that would otherwise look flat.
How AO Maps Improve Realism
Without AO, a PBR material can look artificially clean. Consider a cobblestone floor: the albedo shows the stone colors, the normal map shows surface angles, but only the AO map darkens the gaps between stones where dirt accumulates and light cannot reach. This contact darkening is what makes a 3D scene feel physically grounded. AO is especially visible in interior scenes with diffuse lighting.
Baking AO Maps
AO maps can be baked from 3D geometry in Blender (Render → Bake → Ambient Occlusion), Substance Painter (Bake Mesh Maps), or dedicated tools like xNormal. For flat seamless textures without geometry, you can approximate AO from the height map: blur the height map, invert it, and use Levels to adjust contrast. Cavities (low points in the height map) become dark in the AO map.
Using AO in Material Shaders
In PBR shaders, AO multiplies the diffuse lighting contribution. Plug the AO map into the Ambient Occlusion input of your material. Most engines (Unity, Unreal, Godot) have a dedicated AO slot in their standard material. The effect is subtle but important — surfaces look noticeably more realistic with proper AO applied. For stone and concrete surfaces, AO is one of the most impactful maps after the albedo.
Channel Packing with AO
In game production, AO is typically channel-packed rather than stored as a separate texture. The standard convention packs AO into the Red channel of a combined ORM (Occlusion-Roughness-Metallic) texture. This means the AO map shares a file with roughness and metallic data, reducing texture count and memory usage while keeping all PBR data accessible in a single texture sample.