Почти все слышали про SSAO. Эта техника позволяет рассчитать примерное значение затенения от глобального рассеянного освещения на основе глубины и используется в реальном времени в шейдерах.

Но если вы делаете трёхмерное приложение для веб или широкого круга пользователей, если важно сохранить быстродействие приложения, тогда можно заранее рассчитать освещение/затенение в текстуру. С Ambient Occlusion это тоже работает.
Лайтмап (shadowmap) - текстура, каждая точка в которой имеет собственную трёхмерную координату на сцене. Натянув эту текстуру на сцену, мы получим значение освещённости или затенения на каждом полигоне трёхмерного пространства.
Примерный процесс построения
Выбираем масштаб, разрешение нашей лайтмапы, сколько точек освещения поместится на полигоне размером 1х1.
Полигон плоский, поэтому заведём для каждого полигона Rect - в нём будет нарисовано освещение для этого конкретного полигона. Каждая точка полигона имеет координату в прямоугольнике. А т.к. полигон расположен в пространстве, то каждой точке в прямоугольнике мы можем сопоставить 3D координату.
Используя алгоритмы Bin Packing, укладываем эти прямоугольники на большую текстуру как можно плотнее. Это ключевой момент, мы получили соответствие "3D точка в пространстве - 2D точка в лайтмапе".


В качестве бонуса. Бросаем луч из источника света в эту точку, проверяем пересечение этого луча с другими полигонами, получаем значение освещённости данной точки. Записываем это значение в лайтмап.

Построив лайтмап, рассчитав освещение от каждого источника света, мы можем придать сцене глубины, вычислив для каждой точки лайтмапы значение затенения от рассеянного света - Ambient Occlusion. В каноническом варианте используется метод Монте-Карло: нам необходимо бросить N лучей из точки и вычислить, сколько из них пересекаются с существующей геометрией.

Значение AO можно будет посчитать по формуле:

