Рендеринг в Mapbox GL JS основан на WebGL-пайплайне, в котором ключевую роль играют шейдеры, написанные на GLSL (OpenGL Shading Language). Вся визуализация карты — от геометрии линий до растеризации тайлов и анимации слоёв — в конечном счёте сводится к выполнению вершинных и фрагментных шейдеров на GPU.
Архитектура построена вокруг разделения на два уровня:
JavaScript формирует данные и передаёт их в виде буферов, атрибутов и uniform-параметров, а шейдеры отвечают за финальную визуализацию каждого пикселя.
GLSL используется для описания двух основных стадий графического конвейера:
Отвечает за преобразование геометрии:
В контексте картографического рендеринга ключевая задача — преобразование координат долготы/широты в пиксельные координаты тайловой системы.
Отвечает за вычисление цвета каждого пикселя:
Фрагментный шейдер фактически определяет визуальный стиль карты.
Рендеринг проходит через несколько преобразований координат:
Шейдеры работают преимущественно на последних двух этапах, получая уже подготовленные данные.
Рендеринг слоя в Mapbox GL JS проходит последовательные стадии:
Каждый слой карты соответствует набору шейдерных программ.
Шейдеры организованы как программные шаблоны с параметризацией через uniforms:
Передают глобальные данные:
Данные на вершину:
Интерполируемые значения между vertex и fragment shader:
Шейдеры активно используют встроенные типы GLSL:
Ключевые операции:
vec2 uv = normalize(position);
float t = mix(a, b, p);
float d = dot(v1, v2);
Линии в Mapbox GL JS не являются простыми геометрическими примитивами. Они строятся как экструзия (extrusion) вдоль векторного пути.
В шейдере вычисляется расстояние до центра линии:
Антиалиасинг реализуется через плавный переход:
float alpha = smoothstep(edge0, edge1, distance);
Это позволяет избегать «рваных» краёв при масштабировании.
Шейдеры учитывают уровень детализации (Level of Detail):
LOD влияет на:
Фрагментные шейдеры используют zoom как параметр интерполяции:
float z = u_zoom;
float scale = pow(2.0, z);
Растровые данные (satellite, terrain) обрабатываются через texture sampling:
vec4 color = texture2D(u_image, uv);
Особенности:
Шейдеры обеспечивают корректное смешивание растровых слоёв с векторными.
Стилизация карты в Mapbox GL JS может быть частично перенесена в GLSL:
Пример логики:
Mapbox GL JS предоставляет механизм внедрения собственных WebGL-слоёв через Custom Layer API.
Структура слоя:
onAdd — инициализация WebGL ресурсовrender — выполнение шейдеровВнутри custom layer можно:
Ключевая часть vertex shader — работа с матрицами:
Финальное преобразование:
gl_Position = u_projectionMatrix * u_modelViewMatrix * vec4(position, 1.0);
Камера в Mapbox GL JS поддерживает:
Все эти параметры транслируются в GLSL как uniform-переменные.
Производительность критична для картографического рендеринга.
Основные техники:
Условия заменяются на математические функции:
float mask = step(0.5, value);
precision mediump float;
Снижение вычислений во fragment shader
Объединение ресурсов в одну текстуру
Возникает при наложении слоёв с близкими depth values
Различия между lowp/mediump/highp
Артефакты на границах тайлов
Ошибки при больших координатах на высоких zoom уровнях
Шейдеры являются конечной точкой всей системы визуализации:
Именно шейдерный слой определяет, как географические данные превращаются в непрерывное изображение карты, включая все визуальные эффекты, интерполяции и трансформации.