В Mapbox GL JS система рендеринга основана на WebGL-пайплайне, в котором каждая визуальная сущность преобразуется в набор вершинных данных (attributes) и параметров шейдера (uniforms). Эти два механизма формируют основу того, как слои карты превращаются в пиксели: attributes определяют геометрию и вариативные данные на уровне вершин, а uniforms задают глобальные параметры отрисовки, общие для всего draw-call или слоя.
В WebGL-модели, используемой Mapbox GL JS, каждый слой карты компилируется в один или несколько шейдеров. Эти шейдеры оперируют двумя типами входных данных:
Такое разделение позволяет эффективно обрабатывать большие объёмы геоданных, минимизируя передачу данных в GPU и обеспечивая предсказуемую производительность.
Attributes формируют основу геометрического представления слоёв. Данные поступают из векторных тайлов, где каждая геометрия раскладывается на вершины с сопутствующими атрибутами.
Типичные vertex attributes включают:
Внутренне геометрия преобразуется в буферы WebGL, где каждая вершина представляется структурой фиксированного формата. Например, для линейного слоя могут использоваться атрибуты наподобие:
Для полигональных слоёв и заливок используются атрибуты, позволяющие корректно обрабатывать триангуляцию и внутренние границы полигона.
Vector Tile спецификация предполагает хранение геометрии в виде команд (moveTo, lineTo, closePath), которые при декодировании превращаются в набор вершин. Mapbox GL JS дополнительно обогащает эти данные:
a_pos — позиция вершины в координатах тайлаa_extrude — направление экструдирования (особенно важно
для fill-extrusion)a_data — упакованные служебные параметрыa_color — предварительно интерполированные значения
цвета (в некоторых пайплайнах)Каждый слой использует собственный layout атрибутов, формируемый на этапе компиляции стиля.
Часть style specification в Mapbox GL JS влияет на то, какие данные попадают в attributes. Layout-параметры, как правило, определяют структуру геометрии, тогда как paint-параметры чаще преобразуются в uniforms или интерполируемые атрибуты.
Примеры преобразований:
line-width может стать uniform или атрибутом в
зависимости от наличия интерполяцииfill-color часто передаётся как uniform, если не
зависит от вершинных данныхline-gradient требует атрибутов прогресса вдоль
линииЕсли свойство зависит от zoom, feature-state или expression, компилятор может выбрать стратегию:
Uniforms представляют собой глобальные параметры, передаваемые в шейдер перед отрисовкой слоя или группы объектов. Они используются для описания состояния камеры, тайловой системы и текущих стилевых значений.
Одними из ключевых uniforms являются матрицы трансформации:
u_matrixЭти матрицы обеспечивают перевод координат из пространства тайла в экранное пространство.
Mapbox GL JS использует Web Mercator projection, где uniforms определяют параметры камеры:
Эти параметры передаются в шейдеры через uniforms, позволяя динамически изменять сцену без пересборки буферов.
Часто используются следующие uniform-переменные:
u_zoom — текущий уровень масштабированияu_center — центр карты в нормализованных
координатахu_bearing — угол поворотаu_pitch — наклон камерыu_pixels_per_meter — коэффициенты масштабированияКаждый векторный тайл рендерится с собственным набором uniforms, описывающих его положение в сетке:
Эти uniforms позволяют шейдеру корректно совмещать множество тайлов в единой сцене.
Некоторые визуальные эффекты требуют временного параметра:
В таких случаях используется uniform времени:
u_time — монотонно увеличивающееся значение
времениЭто позволяет реализовывать эффекты без изменения vertex buffers, полностью на стороне GPU.
Mapbox GL JS поддерживает механизм feature-state, позволяющий изменять визуальные свойства отдельных объектов без пересборки источника данных.
При этом:
Такой подход позволяет динамически изменять, например, цвет выделенного объекта или его прозрачность.
Expression-система Mapbox GL JS компилируется в комбинацию:
Например, выражение интерполяции цвета по zoom может быть разложено в:
Symbol layers используют более сложные атрибуты, связанные с текстом и иконками:
Эти данные активно используются в layout-фазе, где выполняется размещение объектов до стадии рендеринга.
3D-слой экструзии полигонов использует дополнительные vertex attributes:
Каждая вершина полигона дублируется для верхней и нижней грани, а attributes определяют геометрию объёма.
Эффективность работы attributes и uniforms напрямую связана с упаковкой данных:
Uniforms минимизируются, поскольку их изменение вызывает переключение состояния GPU.
Custom layer API позволяет напрямую задавать собственные uniforms и attributes для WebGL-рендеринга поверх карты.
В этом случае:
Такой подход используется для интеграции кастомных шейдеров, 3D-объектов и постобработки.
Attributes зависят от данных тайлового кеша. При изменении стиля:
Это разделение позволяет Mapbox GL JS поддерживать плавную интерактивность даже при сложных стилевых изменениях.
В итоговом WebGL-пайплайне:
Разделение responsibilities между attributes и uniforms обеспечивает масштабируемость системы при работе с глобальными картографическими данными.