Многослойность и композитинг

CesiumJS построена вокруг сцены, в которой каждый визуальный элемент существует не изолированно, а в составе многослойной композиции. Рендеринг глобуса формируется через наложение нескольких независимых слоёв данных, проходящих через общий граф отрисовки WebGL, где итоговое изображение является результатом строгого порядка смешивания, глубинного тестирования и постобработки.

В основе визуальной модели CesiumJS лежит сцена (Scene), которая координирует несколько параллельных систем:

  • геометрия поверхности (terrain)
  • изображения (imagery layers)
  • 3D-объекты (primitives, entities, 3D Tiles)
  • эффекты постобработки (post-processing stages)

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

Ключевой принцип — отсутствие «плоского» Z-слоя в классическом UI-смысле. Вместо этого используется комбинация:

  • глубинного буфера (depth buffer)
  • альфа-композитинга (alpha blending)
  • порядковой сортировки
  • экранных эффектов постобработки

Система Imagery Layers

Самый фундаментальный уровень визуальной многослойности — это набор слоёв изображений, управляемых через ImageryLayerCollection.

Каждый слой представляет собой источник растровых тайлов:

  • спутниковые снимки
  • карты дорог
  • гибридные слои
  • пользовательские WMS/WMTS/XYZ источники

Слои накладываются друг на друга по порядку добавления, но итоговое отображение зависит от параметров смешивания:

  • opacity (прозрачность слоя)
  • alpha blending mode
  • brightness / contrast / hue shift
  • gamma correction

Каждый пиксель итогового изображения формируется как результат композиции:

  • базовый слой задаёт цветовое пространство
  • верхние слои модифицируют результат через альфа-смешивание

При этом imagery не является плоской текстурой: тайлы подгружаются динамически в зависимости от уровня детализации (LOD), и каждый уровень может частично перекрывать предыдущий.

Порядок отрисовки и граф сцены

Внутренний граф отрисовки CesiumJS разделяет объекты по категориям:

  • Globe (земной шар и imagery)
  • Opaque geometry
  • Translucent geometry
  • 3D Tiles content
  • Post-process passes

Порядок важен, поскольку WebGL не выполняет автоматическую семантическую сортировку объектов. Вместо этого CesiumJS использует собственную систему:

  • opaque объекты рендерятся первыми с включённым depth write
  • translucent объекты сортируются по расстоянию до камеры
  • 3D Tiles могут переключаться между режимами в зависимости от материала

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

Прозрачность и альфа-композитинг

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

Основные режимы:

  • стандартный alpha blending (SRC_ALPHA, ONE_MINUS_SRC_ALPHA)
  • additive blending для световых эффектов
  • multiplicative blending для затемняющих слоёв

При наложении нескольких прозрачных слоёв возникает проблема порядка (order dependency). CesiumJS частично решает её через:

  • сортировку по глубине
  • разделение opaque/translucent pass
  • order-independent translucency (OIT) в некоторых конфигурациях

Особенно сложным является случай, когда прозрачные imagery layers пересекаются с полупрозрачной геометрией 3D Tiles. В таких ситуациях итоговый цвет пикселя определяется последовательностью проходов рендера, а не только геометрической глубиной.

Комбинация Terrain, Imagery и 3D Tiles

Рельеф (terrain) формирует геометрическую основу сцены. Он задаёт:

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

Imagery накладывается поверх terrain как текстурный слой, но с учётом:

  • уровня детализации terrain tile
  • географической привязки
  • кривизны поверхности

3D Tiles добавляют третий уровень композиции — объёмные данные:

  • здания
  • города
  • инженерные модели
  • фотограмметрия

Важная особенность — 3D Tiles могут:

  • отбрасывать тени на terrain
  • перекрывать imagery через depth testing
  • использовать собственные материалы с alpha blending

Таким образом формируется трёхслойная система:

  1. terrain (геометрическая база)
  2. imagery (растровая текстура поверхности)
  3. 3D geometry (объёмные объекты)

Каждый слой не заменяет предыдущий, а дополняет его в общем буфере глубины.

Постобработка и экранные эффекты

После завершения основного рендеринга сцены запускается pipeline постобработки (PostProcessStageCollection).

Типовые эффекты:

  • bloom (свечение ярких областей)
  • depth of field (размытие по глубине)
  • color grading (цветокоррекция)
  • silhouette (контурная подсветка объектов)

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

Ключевая особенность — постобработка не знает о семантике сцены. Она оперирует только:

  • цветовым буфером
  • depth buffer
  • вспомогательными масками

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

Классификация и клиппинг как элементы композиции

Отдельный уровень многослойности формируется через механизмы classification и clipping.

Classification позволяет:

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

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

Clipping planes вводят геометрическое ограничение:

  • часть сцены отсекается до рендера фрагментов
  • объекты могут быть частично скрыты
  • границы сечения становятся визуальным слоем

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

Управление порядком слоёв и визуальной иерархией

В отличие от классических 2D-систем, где слой = индекс в списке, в CesiumJS многослойность распределена по нескольким уровням:

  • imagery layer stack
  • scene primitive collection ordering
  • depth-based sorting
  • render pass separation

Важную роль играет не только порядок добавления, но и тип материала:

  • opaque всегда доминирует над translucent при равной глубине
  • imagery зависит от порядка коллекции
  • 3D Tiles могут переопределять поведение глубины через batch table

Иерархия формируется динамически в зависимости от положения камеры, LOD и состояния кэша тайлов.

WebGL как основа композитинга

Вся система построена поверх WebGL, где отсутствует встроенная модель сценического графа высокого уровня.

CesiumJS добавляет собственный слой абстракции:

  • управление буферами кадров
  • переключение render state
  • батчинг draw calls
  • контроль depth testing и stencil buffer

Композитинг реализуется через последовательные проходы:

  1. geometry pass
  2. imagery pass
  3. translucent pass
  4. post-process pass

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

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

Многослойная архитектура требует строгого контроля ресурсов:

  • количество imagery layers влияет на число texture bindings
  • 3D Tiles увеличивают число draw calls
  • прозрачные слои ухудшают сортировку
  • post-processing увеличивает число fullscreen passes

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

  • объединение тайлов в батчи
  • кэширование материалов
  • отложенную загрузку уровней детализации
  • минимизацию прозрачных пересечений
  • отключение ненужных post-process stages

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