Shadows система

Архитектура теней в сцене

Механизм теней в CesiumJS построен вокруг экранно-пространственного shadow mapping с поддержкой направленного освещения, где основным источником выступает солнечное освещение сцены. В отличие от классических игровых движков, система рассчитана на глобальную географическую сцену с огромными диапазонами координат и динамическим уровнем детализации.

Ключевым компонентом является объект ShadowMap, привязанный к Scene. Он отвечает за генерацию карт глубины с точки зрения источника света и последующее проецирование теней на геометрию сцены.

Основные уровни интеграции:

  • Scene.shadowMap — глобальная конфигурация теней
  • Globe.enableLighting — включение физически корректного освещения Земли
  • Model.shadows — участие 3D-моделей в отбрасывании/получении теней
  • Primitive.shadows — контроль теней для низкоуровневых примитивов

Источник света и солнечная модель

В основе системы лежит модель солнечного света, где направление света вычисляется из астрономических параметров времени и координат наблюдателя. Это делает тени динамическими и зависящими от:

  • времени суток
  • даты (сезонные изменения угла падения света)
  • позиции камеры относительно поверхности

Свет представлен как направленный (directional light), что позволяет использовать ортографическую проекцию при построении shadow map.


ShadowMap и генерация глубины

ShadowMap выполняет рендеринг сцены с позиции света, формируя карту глубины. Эта карта затем используется при основном рендере для определения затенённых областей.

Внутренний процесс:

  1. Сцена рендерится из позиции солнца
  2. Для каждого фрагмента сохраняется глубина
  3. При финальном рендере пиксель сравнивается с shadow map
  4. Если глубина больше — пиксель считается в тени

Важный аспект — ограничение области теней через bounding volumes, что критично для производительности в глобальной сцене.


Конфигурация теней в Scene

Основная настройка выполняется через объект сцены:

  • включение системы:

    • scene.shadowMap.enabled = true
  • управление качеством:

    • scene.shadowMap.size
  • контроль мягкости:

    • scene.shadowMap.softShadows
  • настройка плотности:

    • scene.shadowMap.darkness

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


Типы теней и участие объектов

Система поддерживает два ключевых поведения объектов:

  • Casting shadows — объект отбрасывает тень
  • Receiving shadows — объект принимает тень

В 3D-моделях это управляется через:

  • castShadows
  • receiveShadows

Для примитивов аналогичные настройки доступны через shadows, где можно выбрать режим:

  • только отбрасывание
  • только получение
  • оба режима
  • отключение

Это важно для оптимизации, так как не все объекты сцены должны участвовать в вычислениях теней.


Cascaded Shadow Maps (CSM)

При работе с глобальной сценой применяется каскадирование shadow maps. Это разделение фрустума камеры на несколько зон с разной детализацией.

Принцип:

  • ближние области получают высокую детализацию
  • дальние области используют более грубую карту

Это позволяет:

  • уменьшить артефакты «лесенок»
  • повысить стабильность теней при движении камеры
  • сохранить производительность на больших масштабах

Проблема артефактов и bias-настройки

Одной из ключевых проблем shadow mapping являются артефакты самозатенения (shadow acne) и световые утечки (peter-panning).

Для контроля используются параметры bias:

  • normalOffsetBias
  • depthBias

Эти значения сдвигают глубину сравнения, предотвращая ложные пересечения поверхностей.

Неправильная настройка приводит к:

  • исчезновению теней
  • разрывам геометрии
  • «плавающим» теням над поверхностью

Мягкие тени и фильтрация

Мягкость теней достигается через фильтрацию shadow map. В CesiumJS применяется PCF-подобное сглаживание (Percentage Closer Filtering).

Эффекты:

  • размывание краёв тени
  • более естественное поведение при солнечном свете
  • снижение визуальной резкости артефактов

При этом увеличивается стоимость рендеринга, так как требуется выборка нескольких texel’ей из shadow map.


Взаимодействие с материалами и освещением

Тени тесно связаны с системой освещения материалов. Влияние особенно заметно на:

  • PBR-материалах
  • terrain shading
  • water rendering

Если включено Globe.enableLighting, поверхность Земли начинает реагировать на направление солнца, а тени становятся физически согласованными с освещением.


Тени в terrain и 3D Tiles

При работе с рельефом и 3D Tiles система теней использует дополнительные оптимизации:

  • уровень детализации влияет на точность теней
  • геометрия может упрощаться для shadow pass
  • применяется отсечение невидимых тайлов

Особенности:

  • terrain может давать разрывы при низком resolution shadow map
  • высокие здания в 3D Tiles требуют увеличенного bias и каскадирования

Производительность и ограничения

Тени являются одной из наиболее дорогих операций в рендеринге сцены.

Факторы нагрузки:

  • размер shadow map
  • количество каскадов
  • число кастящих объектов
  • сложность геометрии

Оптимизационные подходы:

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

Частые визуальные проблемы

В реальных сценах проявляются типичные артефакты:

  • дрожание теней при движении камеры (aliasing)
  • ступенчатые границы при низком разрешении карты
  • исчезновение теней на дальних расстояниях
  • некорректное поведение на пересечениях terrain и моделей

Эти эффекты напрямую связаны с компромиссами между точностью и производительностью shadow mapping в глобальных координатных системах.