Ambient occlusion

Освещение в трёхмерных сценах формирует восприятие глубины, масштаба и взаимного расположения объектов, однако базовых моделей освещения недостаточно для передачи тонких контактных теней в местах соприкосновения геометрии. В таких областях возникает эффект «заполненности светом», который визуально упрощает сцену. Технология ambient occlusion вводит дополнительное затенение, моделирующее частичное перекрытие окружающего света геометрией.

В контексте CesiumJS реализация ambient occlusion опирается на экранное пространство, что позволяет достигать визуального эффекта без построения дорогостоящих глобальных моделей освещения. Подход screen space ambient occlusion (SSAO) использует буфер глубины и нормалей кадра, анализируя локальные окрестности каждого пикселя.


Screen Space Ambient Occlusion строится на предположении, что доступность окружающего света можно оценить по геометрии, видимой в текущем кадре.

Для каждого фрагмента изображения анализируется набор выборок вокруг текущей точки. Эти выборки сравниваются по глубине:

  • если соседняя точка ближе к камере, она считается не влияющей на затенение;
  • если точка находится «за» текущим фрагментом, она уменьшает доступность окружающего света.

Формируется коэффициент окклюзии, который затем используется для затемнения пикселя.

Ключевая особенность подхода заключается в том, что расчёты выполняются исключительно в экранном пространстве, что исключает необходимость анализа полной геометрической сцены.


Архитектура ambient occlusion в CesiumJS

В CesiumJS постобработка реализуется через систему PostProcessStage. Ambient occlusion интегрируется как отдельный этап, накладываемый поверх итогового изображения сцены.

Типичная схема обработки кадра:

  1. Рендеринг геометрии сцены в буферы глубины и цвета
  2. Постобработка освещения
  3. Применение ambient occlusion
  4. Финальное композитное изображение

Этап ambient occlusion работает с уже сформированным кадром и использует информацию о глубине для вычисления затенения.


Screen Space Ambient Occlusion в CesiumJS

Наиболее распространённая реализация основана на Cesium.ScreenSpaceAmbientOcclusion.

В основе лежит выборка соседних пикселей в радиусе, заданном параметрами эффекта. Для каждой выборки вычисляется вклад в окклюзию.

Пример подключения SSAO:

const viewer = new Cesium.Viewer("cesiumContainer", {
    postProcessStages: true
});

viewer.scene.postProcessStages.add(
    Cesium.ScreenSpaceAmbientOcclusion()
);

При активации этапа сцена начинает учитывать локальные затенения, особенно заметные в местах стыков поверхностей и внутри узких пространств.


Параметры управления эффектом

Ambient occlusion в CesiumJS регулируется набором параметров, влияющих на качество и производительность.

Интенсивность затенения

Параметр определяет силу затемнения в областях окклюзии.

  • высокие значения усиливают контраст между открытыми и закрытыми областями
  • низкие значения дают более мягкий визуальный эффект

Радиус выборки

Радиус определяет область, в которой производится анализ соседних пикселей.

  • малый радиус усиливает локальные детали
  • большой радиус создаёт более глобальное затемнение, но может приводить к размытию

Смещение глубины (bias)

Используется для предотвращения артефактов самозатенения. Без корректировки возникают ложные тени на гладких поверхностях.

Количество семплов

Определяет число направлений, в которых производится выборка глубины:

  • малое число семплов повышает производительность, но снижает точность
  • большое число семплов улучшает качество, увеличивая нагрузку на GPU

Математическая модель окклюзии

Оценка доступности окружающего света строится на интегральном приближении, заменяемом дискретной выборкой.

AO(p)=1-_{i=1}^{N}V(p,_i)

где:

  • ( AO(p) ) — коэффициент окклюзии в точке ( p )
  • ( N ) — число направлений выборки
  • ( V(p, _i) ) — функция видимости в направлении ( _i )

Функция видимости принимает значение:

  • 1, если направление перекрыто геометрией
  • 0, если пространство свободно

Результирующее значение интерпретируется как степень затенения: чем выше значение суммы, тем сильнее окклюзия.


Использование буфера глубины

Ключевым источником данных для SSAO является depth buffer. Он содержит расстояние до ближайшей видимой поверхности для каждого пикселя.

В процессе вычисления:

  1. глубина текущего пикселя преобразуется в мировые координаты;
  2. формируется набор направлений в касательной плоскости;
  3. выполняется сравнение глубин соседних точек;
  4. формируется карта окклюзии.

CesiumJS использует высокоточные текстуры глубины, что позволяет корректно работать с большими мировыми координатами.


Шум и стохастическая выборка

Для предотвращения регулярных артефактов в SSAO применяется случайная ротация семплов. Это снижает видимость повторяющихся паттернов.

Используется шумовая текстура, которая изменяет направление выборки для каждого пикселя. После первичного расчёта применяется фильтрация для сглаживания результата.


Фильтрация и размытие результата

Сырые карты окклюзии содержат шум, особенно при малом числе семплов. Для улучшения качества применяется постфильтрация.

Наиболее распространённые методы:

  • bilateral blur (сохранение границ глубины)
  • gaussian blur (простое сглаживание)
  • edge-aware filtering (учёт перепадов глубины)

CesiumJS использует адаптивные методы фильтрации, сохраняющие резкие границы объектов.


Производительность и оптимизация

Ambient occlusion относится к тяжёлым постпроцессам, поскольку выполняет множественные выборки на пиксель.

Основные факторы нагрузки:

  • разрешение экрана
  • число семплов
  • радиус окклюзии
  • количество объектов в сцене

Оптимизация достигается через:

  • снижение числа семплов в реальном времени
  • динамическое уменьшение качества при движении камеры
  • ограничение области применения эффекта
  • использование половинного разрешения буфера

Влияние на визуальное восприятие сцены

Ambient occlusion усиливает визуальное разделение объектов за счёт локального затемнения в местах соприкосновения.

Наиболее заметные эффекты:

  • усиление контакта объектов с поверхностью
  • подчёркивание углублений и щелей
  • увеличение восприятия глубины в городских сценах
  • повышение читаемости сложной геометрии

При отсутствии эффекта сцена выглядит более «плоской», особенно при равномерном освещении.


Интеграция с глобальным освещением Cesium

CesiumJS использует физически корректное освещение для атмосферы, солнца и теней. Ambient occlusion не заменяет эти модели, а дополняет их.

Комбинация эффектов формирует многослойную модель освещения:

  • directional light (солнце)
  • shadow mapping (длинные тени)
  • atmospheric scattering (рассеивание света)
  • screen space ambient occlusion (локальные тени)

Взаимодействие этих компонентов позволяет достигать высокой визуальной плотности сцены без увеличения сложности геометрии.


Артефакты и ограничения

Screen space подход накладывает ряд ограничений:

  • отсутствие информации о невидимой геометрии
  • ошибки на краях экрана
  • некорректная работа при больших перепадах глубины
  • зависимость от качества depth buffer

Особенно заметны артефакты в случаях:

  • тонких объектов
  • пересекающихся поверхностей
  • сцен с большим масштабом координат

Динамическое управление эффектом

В реальных сценах параметры ambient occlusion часто изменяются в зависимости от состояния камеры.

Типичные стратегии:

  • уменьшение качества при быстром движении камеры
  • отключение эффекта на дальних расстояниях
  • адаптация радиуса в зависимости от масштаба сцены

Такие подходы позволяют балансировать между визуальным качеством и стабильной частотой кадров.


Применение в крупных сценах Cesium

В геопространственных приложениях CesiumJS ambient occlusion используется для:

  • визуализации городских моделей
  • анализа инфраструктуры
  • работы с BIM-данными
  • отображения плотных 3D tilesets

Наиболее выраженный эффект наблюдается в сценах с высокой плотностью геометрии, где локальные тени критичны для восприятия структуры.