Primitive API

Primitive API представляет собой низкоуровневый слой визуализации, построенный поверх графического движка WebGL и ориентированный на максимальную производительность при отрисовке геометрии. В отличие от Entity API, который оперирует абстракциями высокого уровня (объекты сцены, декларативные описания), Primitive API работает с геометрическими примитивами, материалами и состояниями рендеринга напрямую.

Ключевая идея заключается в разделении данных на две основные сущности: геометрия (Geometry) и визуальное представление (Appearance). Такое разделение позволяет эффективно переиспользовать геометрию, объединять множество объектов в батчи и минимизировать количество draw calls.


Базовые компоненты Primitive API

Primitive

Primitive является базовым объектом сцены и представляет собой единицу отрисовки. Он инкапсулирует:

  • геометрию или набор геометрий
  • состояние WebGL
  • материал (через Appearance)
  • параметры отрисовки (например, depth testing, culling)

Primitive не содержит семантики объекта мира, а лишь инструкции для GPU.


GeometryInstance

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

Типичная структура:

  • geometry: описывает форму (квад, коробка, линия, многоугольник)
  • modelMatrix: матрица трансформации
  • attributes: переопределяемые данные (цвет, show, distance display condition)

Использование GeometryInstance является основным механизмом батчинга.


Geometry

Geometry определяет чистую форму без привязки к сцене. Это могут быть:

  • BoxGeometry
  • CylinderGeometry
  • EllipsoidGeometry
  • PolygonGeometry
  • PolylineGeometry

Геометрия преобразуется в буферы вершин (Vertex Buffer Objects), которые затем передаются в GPU.


Система Appearance

Appearance определяет способ визуализации геометрии. Она аналогична материалу в классических 3D-движках, но имеет более тесную связь с WebGL pipeline.

Основные типы:

  • MaterialAppearance — поддержка материалов и шейдерных эффектов
  • PerInstanceColorAppearance — окраска на уровне экземпляра
  • PolylineMaterialAppearance — специализированное отображение линий

Appearance определяет:

  • vertex shader
  • fragment shader
  • uniforms
  • render state

Модель рендеринга Primitive

Внутренний процесс отрисовки включает несколько этапов:

  1. Подготовка GeometryInstance
  2. Компиляция Geometry в GPU-буферы
  3. Создание Vertex Array Object
  4. Привязка Appearance (шейдеров)
  5. Передача uniform-параметров
  6. Вызов draw call

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


Батчинг и производительность

Primitive API ориентирован на агрегацию данных. Батчинг достигается за счет:

  • объединения GeometryInstance в один Primitive
  • использования общих буферов вершин
  • минимизации переключений шейдеров
  • инстансинга (instancing) в WebGL2

Эффективность особенно заметна при отображении большого количества однотипных объектов (например, зданий или тайлов).


Матрицы трансформации

Каждый GeometryInstance может иметь собственную модельную матрицу:

  • translation (перемещение)
  • rotation (вращение)
  • scale (масштаб)

Матрица применяется на GPU, что позволяет избегать пересчётов геометрии на CPU.


Атрибуты инстансов

Primitive API поддерживает динамические атрибуты:

  • color — цвет экземпляра
  • show — видимость
  • distanceDisplayCondition — диапазон отображения по расстоянию
  • featureId — идентификация для picking

Эти атрибуты передаются в шейдеры как per-instance data.


Шейдерная модель

Шейдеры в Primitive API задаются через Appearance и состоят из:

  • vertex shader: обработка вершин и трансформаций
  • fragment shader: вычисление цвета пикселей
  • uniforms: глобальные параметры сцены
  • attributes: данные геометрии и экземпляров

Пример концепции обработки:

  • вершина преобразуется модельной матрицей
  • применяется проекционная матрица камеры
  • вычисляется освещение или цвет

Material система

Материалы определяют визуальные свойства поверхности:

  • цвет
  • текстуры
  • прозрачность
  • процедурные эффекты

Material интегрируется в Appearance и может быть динамически изменяемым.

Поддерживаются процедурные материалы, например:

  • полосы
  • градиенты
  • анимации смещения текстуры

Clipping и culling

Primitive API активно использует отсечение:

  • frustum culling — отсечение вне камеры
  • back-face culling — скрытие обратных граней
  • depth testing — проверка глубины
  • clipping planes — отсечение по пользовательским плоскостям

Clipping planes особенно важны для анализа геопространственных данных.


Интеграция с тайловой системой

Primitive API часто используется совместно с 3D Tiles:

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

Это обеспечивает масштабируемость до миллиардов полигонов.


Pick system (выбор объектов)

Primitive поддерживает механизм picking:

  • ray casting в экранных координатах
  • идентификация GeometryInstance
  • доступ к attributes экземпляра

FeatureId используется для связывания GPU-объекта с логической сущностью.


Динамическое обновление

Primitive API не ориентирован на частые изменения геометрии. Однако поддерживаются:

  • обновление appearance
  • изменение instance attributes
  • пересоздание Primitive при изменении структуры

Изменение геометрии требует пересборки GPU-буферов.


Ограничения модели Primitive API

Низкоуровневая природа накладывает ограничения:

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

Эти ограничения компенсируются высокой производительностью.


Взаимодействие с Scene

Primitive API интегрирован в Scene как базовый слой:

  • Scene управляет камерой и рендер-циклом
  • Primitive выполняет отрисовку геометрии
  • PostProcessStage добавляет эффекты после рендера

Порядок выполнения строго фиксирован в pipeline.


Оптимизационные стратегии

На практике применяются следующие подходы:

  • агрегация геометрий в минимальное число Primitive
  • использование instancing вместо дублирования
  • минимизация изменения state machine WebGL
  • использование статических буферов
  • разделение динамических и статических объектов

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

Primitive API используется для:

  • визуализации 3D городов
  • отображения BIM-моделей
  • рендеринга спутниковых данных
  • построения кастомных тайловых слоев
  • анализа пространственных данных в реальном времени