Silhouette-подсветка в CesiumJS реализуется как постобработка
изображения сцены, при которой выбранные объекты получают контурное
выделение поверх уже отрендеренной 3D-геометрии. Механизм основан на
извлечении границ объектов в буфере глубины и формировании маски,
которая затем используется для отрисовки цветного ореола вокруг
модели.
Силуэт в CesiumJS не является свойством геометрии. Он формируется на
этапе постобработки, когда сцена уже отрисована. Основная идея
заключается в сравнении глубины и нормалей пикселей:
- пиксели, принадлежащие выбранному объекту, помечаются в отдельном
буфере;
- вычисляются границы между соседними пикселями с разной
принадлежностью;
- границы расширяются на заданное количество пикселей, формируя
контур;
- контур окрашивается в заданный цвет.
Такой подход позволяет выделять объекты независимо от их типа: 3D
Tiles, primitives, entities или модели glTF.
PostProcessStage и
SilhouetteStage
В CesiumJS постобработка реализуется через систему стадий:
Scene.postProcessStages — контейнер всех эффектов
постобработки;
PostProcessStage — базовый слой обработки
изображения;
- специализированные стадии, включая силуэтные эффекты.
Силуэтная подсветка чаще всего реализуется через готовую
конфигурацию:
- создание стадии силуэта;
- привязка к выбранным объектам сцены;
- настройка цвета и ширины контура.
Пример логики создания стадии:
const silhouetteStage = Cesium.PostProcessStageLibrary.createSilhouetteStage();
scene.postProcessStages.add(silhouetteStage);
После добавления стадии она начинает участвовать в финальном рендере
кадра.
Привязка силуэта к объектам
сцены
Силуэт не применяется глобально ко всей сцене — он работает
выборочно. Объекты добавляются в список выделения:
- Entity (через
viewer.entities);
- 3D Tiles features;
- модели и primitives.
Механизм выделения основан на коллекциях типа
ColorGeometryInstanceAttribute или внутренних feature
ID.
Типичный сценарий:
- пользователь выбирает объект;
- объект добавляется в «highlight set»;
- постпроцессинг формирует маску только для этих объектов.
Цвет и интенсивность контура
Основные параметры силуэта:
- цвет (color) — определяет визуальный акцент;
- толщина (length / width) — влияет на ширину
ореола;
- альфа-канал — регулирует прозрачность
свечения;
- режим смешивания — задаёт поведение наложения на
фон.
Контур может быть:
- монохромным (например, белый или жёлтый);
- цветовым по типу объекта;
- динамическим (меняющим цвет во времени).
Внутренняя работа буферов
Силуэтная подсветка использует несколько промежуточных буферов:
- Color buffer — исходное изображение сцены;
- Depth buffer — информация о глубине пикселей;
- Stencil buffer — маска выбранных объектов;
- Silhouette mask — расширенный контур.
Алгоритм обработки:
- из depth buffer извлекаются границы объекта;
- stencil buffer отмечает принадлежность пикселей;
- применяется dilation (расширение области);
- финальный слой накладывается поверх сцены.
Работа с 3D Tiles и
feature selection
При работе с 3D Tiles силуэт применяется к отдельным
feature-элементам тайла. Это важно, поскольку:
- один тайл может содержать тысячи объектов;
- каждый объект имеет собственный feature ID;
- выделение происходит без перерасчёта геометрии.
Принцип:
- идентификация feature через
Cesium3DTileFeature;
- добавление в список подсветки;
- обновление post-process stage.
Комбинирование с другими
эффектами
Силуэтная подсветка часто используется совместно с другими
постэффектами:
- bloom (свечение);
- ambient occlusion;
- depth of field;
- color grading.
Особенности комбинирования:
- силуэт должен применяться после основных освещающих эффектов;
- порядок стадий влияет на визуальный результат;
- чрезмерное количество эффектов снижает производительность.
Производительность и
оптимизация
Силуэт — это GPU-операция, и её стоимость зависит от:
- разрешения экрана;
- количества выделенных объектов;
- сложности сцены;
- числа активных post-process stages.
Оптимизационные практики:
- ограничение количества одновременно выделенных объектов;
- использование упрощённых моделей для дальних объектов;
- отключение силуэта при низком FPS;
- применение batch selection для 3D Tiles.
Типовые режимы подсветки
Силуэт может работать в нескольких режимах:
- внешний контур — подсветка только внешних
границ;
- двойной контур — внутренняя и внешняя обводка;
- пульсирующий силуэт — изменение толщины во
времени;
- цветовой градиент — переход цвета по длине
контура.
Эти режимы реализуются через модификацию параметров постобработки и
динамическое обновление stage.
Интеграция с
пользовательским вводом
Чаще всего силуэтная подсветка привязывается к событиям сцены:
- click / pick;
- mouse move hover;
- selection box;
- spatial queries.
Алгоритм взаимодействия:
- ray casting определяет объект под курсором;
- объект добавляется в коллекцию подсветки;
- post-process stage обновляется в следующем кадре;
- предыдущая подсветка очищается или сохраняется.
Ограничения механизма
Силуэтная подсветка имеет архитектурные ограничения:
- не учитывает внутреннюю структуру геометрии;
- зависит от качества depth buffer;
- может давать артефакты на пересекающихся поверхностях;
- ограничена GPU-возможностями устройства.
Особенно заметны артефакты:
- на тонких объектах;
- при низкой точности глубины;
- при наложении нескольких силуэтов.
Особенности
рендеринга в реальном времени
Силуэт формируется каждый кадр, что означает:
- постоянное обновление буферов;
- повторное вычисление границ;
- синхронизацию с камерой.
Изменение положения камеры автоматически перестраивает контуры,
поскольку silhouette зависит от проекции и глубины сцены.
Использование в
аналитических сценах
Силуэтная подсветка применяется в аналитических приложениях:
- выделение зданий в городских моделях;
- подсветка объектов инфраструктуры;
- навигационные системы;
- мониторинг 3D-данных.
Главная особенность — независимость от семантики объекта: любой
элемент сцены может быть выделен одинаковым способом.
Взаимодействие с
pick-проекцией
Pick-система CesiumJS работает совместно с силуэтом:
- pick определяет объект;
- силуэт визуализирует его состояние;
- изменение состояния отражается в постобработке.
Таким образом, picking отвечает за логику выбора, а silhouette — за
визуальное представление.
Архитектурная роль
постобработки
Silhouette является частью общей архитектуры post-processing
pipeline:
- рендер сцены;
- сбор буферов;
- применение эффектов;
- финальный композитинг.
Такой подход позволяет отделить геометрию от визуальных эффектов,
сохраняя высокую гибкость системы и независимость визуальных слоёв.