Primitive API представляет собой низкоуровневый слой визуализации, построенный поверх графического движка WebGL и ориентированный на максимальную производительность при отрисовке геометрии. В отличие от Entity API, который оперирует абстракциями высокого уровня (объекты сцены, декларативные описания), Primitive API работает с геометрическими примитивами, материалами и состояниями рендеринга напрямую.
Ключевая идея заключается в разделении данных на две основные сущности: геометрия (Geometry) и визуальное представление (Appearance). Такое разделение позволяет эффективно переиспользовать геометрию, объединять множество объектов в батчи и минимизировать количество draw calls.
Primitive является базовым объектом сцены и представляет собой единицу отрисовки. Он инкапсулирует:
Primitive не содержит семантики объекта мира, а лишь инструкции для GPU.
GeometryInstance служит контейнером для геометрии с индивидуальными атрибутами. Он позволяет комбинировать одинаковые геометрические структуры с разными трансформациями и цветами без дублирования геометрических данных.
Типичная структура:
Использование GeometryInstance является основным механизмом батчинга.
Geometry определяет чистую форму без привязки к сцене. Это могут быть:
Геометрия преобразуется в буферы вершин (Vertex Buffer Objects), которые затем передаются в GPU.
Appearance определяет способ визуализации геометрии. Она аналогична материалу в классических 3D-движках, но имеет более тесную связь с WebGL pipeline.
Основные типы:
Appearance определяет:
Внутренний процесс отрисовки включает несколько этапов:
Ключевой оптимизацией является группировка геометрий в один Primitive, что уменьшает количество вызовов WebGL.
Primitive API ориентирован на агрегацию данных. Батчинг достигается за счет:
Эффективность особенно заметна при отображении большого количества однотипных объектов (например, зданий или тайлов).
Каждый GeometryInstance может иметь собственную модельную матрицу:
Матрица применяется на GPU, что позволяет избегать пересчётов геометрии на CPU.
Primitive API поддерживает динамические атрибуты:
Эти атрибуты передаются в шейдеры как per-instance data.
Шейдеры в Primitive API задаются через Appearance и состоят из:
Пример концепции обработки:
Материалы определяют визуальные свойства поверхности:
Material интегрируется в Appearance и может быть динамически изменяемым.
Поддерживаются процедурные материалы, например:
Primitive API активно использует отсечение:
Clipping planes особенно важны для анализа геопространственных данных.
Primitive API часто используется совместно с 3D Tiles:
Это обеспечивает масштабируемость до миллиардов полигонов.
Primitive поддерживает механизм picking:
FeatureId используется для связывания GPU-объекта с логической сущностью.
Primitive API не ориентирован на частые изменения геометрии. Однако поддерживаются:
Изменение геометрии требует пересборки GPU-буферов.
Низкоуровневая природа накладывает ограничения:
Эти ограничения компенсируются высокой производительностью.
Primitive API интегрирован в Scene как базовый слой:
Порядок выполнения строго фиксирован в pipeline.
На практике применяются следующие подходы:
Primitive API используется для: