What Is an Ambient Occlusion Map? Soft Shadow, Real Depth

7 min read · Last updated May 2026

Split-screen 3D render of a stone relief — left without ambient occlusion looking flat and floating, right with ambient occlusion showing soft contact shadows in every crevice
Left: no ambient occlusion — flat and floating. Right: AO darkens the crevices and the surface suddenly has depth.

You know that feeling when a textured surface looks technically correct but somehow flat and weightless, like a sticker? Nine times out of ten it’s missing its ambient occlusion map. AO is the soft contact shadow that lives in every crevice, seam, and corner — the thing that tells your eye a surface is real and grounded.

It’s one of the quietest maps in a PBR set and one of the most missed. This guide explains what an AO map actually stores, how it differs from the shadows your engine already computes, and how to make one.

What an ambient occlusion map stores

Ambient occlusion measures how exposed each point of a surface is to ambient light. A flat, open area gets light from all directions, so it’s bright. A deep crevice — the bottom of a mortar line, the inside of a bolt hole, the gap between cobblestones — is blocked from most directions, so it’s darker. An AO map bakes that into a greyscale image: white means fully lit, black means fully occluded.

Crucially, it stores no actual shadow direction and no colour — just “how buried is this pixel.” The engine uses it to darken ambient light in the right places, which is what makes detail read as carved-in rather than painted-on.

A greyscale ambient occlusion map of a riveted metal panel on the left with dark recesses, and the final shaded panel using that AO on the right
The greyscale AO map (left) and what it does (right). Dark = occluded crevices; the shading reads those as real depth.

AO map vs SSAO: baked vs real-time

These get confused constantly, but they operate at different scales:

  • AO map — baked into a texture, stores the fine, surface-level occlusion of a material (mortar, grain, rivets). Cheap at render time because it’s precomputed.
  • SSAO / GTAO — computed live by the engine each frame, handles the bigger contact shadows between objects (a crate against a wall). More expensive, more dynamic.

You want both. The map handles the detail you authored into the texture; screen-space AO handles the scene the player assembles. They stack without fighting.

AO vs normal map: they’re partners

A normal map fakes the direction of surface detail so light catches the bumps. An AO map darkens the recesses that detail sits in. Use a normal map alone and the cracks light up too brightly from ambient light; add AO and those cracks gain shadow and the whole surface settles into depth. They’re a pair, not alternatives.

Close-up of a weathered stone surface showing soft dark ambient occlusion shadows nestled in every crack and pit, giving strong three-dimensional depth
Look at the cracks: the soft darkening down inside them is ambient occlusion doing its quiet job.

How engines use the AO map

The renderer multiplies the AO value into the surface’s ambient and indirect lighting, darkening occluded areas. In a correct PBR setup it affects only ambient/indirect light — not direct light — so a crevice doesn’t get unrealistically black when a lamp shines straight into it. Many pipelines pack AO into the red channel of a combined “ORM” map (Occlusion, Roughness, Metalness) to save texture memory.

Making an ambient occlusion map

  • Bake it from a high-poly model in Blender, Marmoset Toolbag, or Substance — the most accurate route for hero assets.
  • Derive it from a height map or photo — quick and good enough for many surfaces.
  • Generate it as part of a full PBR set so it agrees with the colour and normal.

That last route is the fastest. CraftPBR produces an AO map alongside base colour, normal, roughness, and height from a text prompt or photo — the same text to texture workflow, with the contact shadow already baked to match.

Get an AO map with your PBR set
Describe a surface or drop a photo, get base colour, normal, roughness, AO, and height. Free.
Open Studio →

AO maps in Unity, Unreal, Blender, and Godot

  • Unity — assign to the Occlusion slot (or the green channel of a mask map in HDRP/URP). Import as Non-Color. There’s an occlusion strength slider.
  • Unreal — plug into the Ambient Occlusion input of the material, or use the red channel of a packed ORM texture. Import as a linear/masks texture (sRGB off).
  • Blender — multiply the AO map into the base colour, or mix it into a MixRGB before the Principled BSDF; set the image to Non-Color.
  • Godot — enable AO in StandardMaterial3D and assign the texture (or its channel); set it to the ambient light affect, not direct.
A detailed 3D render of a cluttered workshop shelf where ambient occlusion grounds every object with soft contact shadows in the gaps and corners
Every soft shadow where objects meet and surfaces tuck together is ambient occlusion grounding the scene.

Key takeaways

  • An AO map is a greyscale texture storing how occluded each pixel is from ambient light — white lit, black buried
  • It adds the soft contact shadow that makes a surface look grounded instead of floating
  • The baked AO map handles texture-scale detail; SSAO handles object-scale contact — use both
  • AO and normal maps are partners: normals fake the bumps, AO shadows the recesses
  • It affects ambient/indirect light only, and is often packed into the red channel of an ORM map
  • Always import it as linear / Non-Color, never sRGB

Frequently asked questions

What is an ambient occlusion map?

An ambient occlusion (AO) map is a greyscale texture that stores how much ambient light reaches each part of a surface. Dark areas are crevices and contact points where light is blocked; white areas are fully exposed. It adds soft contact shadow that makes a surface look grounded and three-dimensional.

What is the difference between an AO map and SSAO?

An AO map is baked into a texture ahead of time and stores the fine, surface-level occlusion of a material. SSAO (screen-space ambient occlusion) is computed live by the engine for larger contact shadows between objects. They complement each other — the map handles texture detail, SSAO handles the scene.

Do I need an ambient occlusion map if I have a normal map?

They do different jobs. A normal map fakes the direction of surface detail; an AO map darkens the crevices that detail creates. Without AO, deep cracks and seams look too bright and the surface flattens. Together they sell depth far better than either alone.

How is an ambient occlusion map used in a material?

The engine multiplies the AO map into the ambient and diffuse lighting, darkening the occluded areas. In most PBR setups it affects only indirect/ambient light so it does not double-darken under direct light. Some pipelines pack AO into a channel of a combined map alongside roughness and metalness.

How do you make an ambient occlusion map?

Bake it from a high-poly model in Blender, Marmoset, or Substance, derive it from a height map, or generate it as part of a PBR set. Tools like CraftPBR produce an AO map alongside base colour, normal, and roughness from a text prompt or photo, already matched to the surface.

Should an ambient occlusion map be sRGB or linear?

Linear (non-color data). An AO map stores light values, not colour, so importing it as sRGB will gamma-correct the data and make the occlusion too strong or too weak. Set it to linear / Non-Color in every engine, the same as normal and roughness maps.