Освещение в трёхмерных сценах формирует восприятие глубины, масштаба и взаимного расположения объектов, однако базовых моделей освещения недостаточно для передачи тонких контактных теней в местах соприкосновения геометрии. В таких областях возникает эффект «заполненности светом», который визуально упрощает сцену. Технология ambient occlusion вводит дополнительное затенение, моделирующее частичное перекрытие окружающего света геометрией.
В контексте CesiumJS реализация ambient occlusion опирается на экранное пространство, что позволяет достигать визуального эффекта без построения дорогостоящих глобальных моделей освещения. Подход screen space ambient occlusion (SSAO) использует буфер глубины и нормалей кадра, анализируя локальные окрестности каждого пикселя.
Screen Space Ambient Occlusion строится на предположении, что доступность окружающего света можно оценить по геометрии, видимой в текущем кадре.
Для каждого фрагмента изображения анализируется набор выборок вокруг текущей точки. Эти выборки сравниваются по глубине:
Формируется коэффициент окклюзии, который затем используется для затемнения пикселя.
Ключевая особенность подхода заключается в том, что расчёты выполняются исключительно в экранном пространстве, что исключает необходимость анализа полной геометрической сцены.
В CesiumJS постобработка реализуется через систему
PostProcessStage. Ambient occlusion интегрируется как
отдельный этап, накладываемый поверх итогового изображения сцены.
Типичная схема обработки кадра:
Этап ambient occlusion работает с уже сформированным кадром и использует информацию о глубине для вычисления затенения.
Наиболее распространённая реализация основана на
Cesium.ScreenSpaceAmbientOcclusion.
В основе лежит выборка соседних пикселей в радиусе, заданном параметрами эффекта. Для каждой выборки вычисляется вклад в окклюзию.
Пример подключения SSAO:
const viewer = new Cesium.Viewer("cesiumContainer", {
postProcessStages: true
});
viewer.scene.postProcessStages.add(
Cesium.ScreenSpaceAmbientOcclusion()
);
При активации этапа сцена начинает учитывать локальные затенения, особенно заметные в местах стыков поверхностей и внутри узких пространств.
Ambient occlusion в CesiumJS регулируется набором параметров, влияющих на качество и производительность.
Параметр определяет силу затемнения в областях окклюзии.
Радиус определяет область, в которой производится анализ соседних пикселей.
Используется для предотвращения артефактов самозатенения. Без корректировки возникают ложные тени на гладких поверхностях.
Определяет число направлений, в которых производится выборка глубины:
Оценка доступности окружающего света строится на интегральном приближении, заменяемом дискретной выборкой.
AO(p)=1-_{i=1}^{N}V(p,_i)
где:
Функция видимости принимает значение:
Результирующее значение интерпретируется как степень затенения: чем выше значение суммы, тем сильнее окклюзия.
Ключевым источником данных для SSAO является depth buffer. Он содержит расстояние до ближайшей видимой поверхности для каждого пикселя.
В процессе вычисления:
CesiumJS использует высокоточные текстуры глубины, что позволяет корректно работать с большими мировыми координатами.
Для предотвращения регулярных артефактов в SSAO применяется случайная ротация семплов. Это снижает видимость повторяющихся паттернов.
Используется шумовая текстура, которая изменяет направление выборки для каждого пикселя. После первичного расчёта применяется фильтрация для сглаживания результата.
Сырые карты окклюзии содержат шум, особенно при малом числе семплов. Для улучшения качества применяется постфильтрация.
Наиболее распространённые методы:
CesiumJS использует адаптивные методы фильтрации, сохраняющие резкие границы объектов.
Ambient occlusion относится к тяжёлым постпроцессам, поскольку выполняет множественные выборки на пиксель.
Основные факторы нагрузки:
Оптимизация достигается через:
Ambient occlusion усиливает визуальное разделение объектов за счёт локального затемнения в местах соприкосновения.
Наиболее заметные эффекты:
При отсутствии эффекта сцена выглядит более «плоской», особенно при равномерном освещении.
CesiumJS использует физически корректное освещение для атмосферы, солнца и теней. Ambient occlusion не заменяет эти модели, а дополняет их.
Комбинация эффектов формирует многослойную модель освещения:
Взаимодействие этих компонентов позволяет достигать высокой визуальной плотности сцены без увеличения сложности геометрии.
Screen space подход накладывает ряд ограничений:
Особенно заметны артефакты в случаях:
В реальных сценах параметры ambient occlusion часто изменяются в зависимости от состояния камеры.
Типичные стратегии:
Такие подходы позволяют балансировать между визуальным качеством и стабильной частотой кадров.
В геопространственных приложениях CesiumJS ambient occlusion используется для:
Наиболее выраженный эффект наблюдается в сценах с высокой плотностью геометрии, где локальные тени критичны для восприятия структуры.