Механизм теней в CesiumJS построен вокруг экранно-пространственного shadow mapping с поддержкой направленного освещения, где основным источником выступает солнечное освещение сцены. В отличие от классических игровых движков, система рассчитана на глобальную географическую сцену с огромными диапазонами координат и динамическим уровнем детализации.
Ключевым компонентом является объект ShadowMap,
привязанный к Scene. Он отвечает за генерацию карт глубины
с точки зрения источника света и последующее проецирование теней на
геометрию сцены.
Основные уровни интеграции:
Scene.shadowMap — глобальная конфигурация тенейGlobe.enableLighting — включение физически корректного
освещения ЗемлиModel.shadows — участие 3D-моделей в
отбрасывании/получении тенейPrimitive.shadows — контроль теней для низкоуровневых
примитивовВ основе системы лежит модель солнечного света, где направление света вычисляется из астрономических параметров времени и координат наблюдателя. Это делает тени динамическими и зависящими от:
Свет представлен как направленный (directional light),
что позволяет использовать ортографическую проекцию при построении
shadow map.
ShadowMap выполняет рендеринг сцены с позиции света,
формируя карту глубины. Эта карта затем используется при основном
рендере для определения затенённых областей.
Внутренний процесс:
Важный аспект — ограничение области теней через bounding volumes, что критично для производительности в глобальной сцене.
Основная настройка выполняется через объект сцены:
включение системы:
scene.shadowMap.enabled = trueуправление качеством:
scene.shadowMap.sizeконтроль мягкости:
scene.shadowMap.softShadowsнастройка плотности:
scene.shadowMap.darknessПараметр darkness регулирует интенсивность затемнения
теней, позволяя адаптировать визуальный стиль под разные сценарии — от
аналитических до визуализационных.
Система поддерживает два ключевых поведения объектов:
В 3D-моделях это управляется через:
castShadowsreceiveShadowsДля примитивов аналогичные настройки доступны через
shadows, где можно выбрать режим:
Это важно для оптимизации, так как не все объекты сцены должны участвовать в вычислениях теней.
При работе с глобальной сценой применяется каскадирование shadow maps. Это разделение фрустума камеры на несколько зон с разной детализацией.
Принцип:
Это позволяет:
Одной из ключевых проблем shadow mapping являются артефакты самозатенения (shadow acne) и световые утечки (peter-panning).
Для контроля используются параметры bias:
normalOffsetBiasdepthBiasЭти значения сдвигают глубину сравнения, предотвращая ложные пересечения поверхностей.
Неправильная настройка приводит к:
Мягкость теней достигается через фильтрацию shadow map. В CesiumJS применяется PCF-подобное сглаживание (Percentage Closer Filtering).
Эффекты:
При этом увеличивается стоимость рендеринга, так как требуется выборка нескольких texel’ей из shadow map.
Тени тесно связаны с системой освещения материалов. Влияние особенно заметно на:
Если включено Globe.enableLighting, поверхность Земли
начинает реагировать на направление солнца, а тени становятся физически
согласованными с освещением.
При работе с рельефом и 3D Tiles система теней использует дополнительные оптимизации:
Особенности:
Тени являются одной из наиболее дорогих операций в рендеринге сцены.
Факторы нагрузки:
Оптимизационные подходы:
В реальных сценах проявляются типичные артефакты:
Эти эффекты напрямую связаны с компромиссами между точностью и производительностью shadow mapping в глобальных координатных системах.