Управление яркостью

Базовая модель визуального освещения в Mapbox GL JS

Визуальная яркость карты в Mapbox GL JS формируется на нескольких уровнях рендеринга: стилевом, слоёвом и источниковом. В отличие от классической CSS-модели, где яркость управляется глобальными фильтрами, карта разбивается на независимые слои, каждый из которых может иметь собственные параметры освещения.

Ключевое значение имеет тип слоя:

  • растровые слои (raster)
  • векторные слои (vector)
  • 3D-слои (fill-extrusion)
  • слои атмосферы (sky, fog)
  • освещение сцены (light)

Каждый из этих уровней по-своему влияет на итоговую яркость изображения.


Растровая яркость: управление через свойства слоя

Для растровых тайлов применяется отдельный набор параметров, позволяющих изменять восприятие яркости без изменения исходных данных.

Основные свойства:

  • raster-brightness-min
  • raster-brightness-max
  • raster-contrast
  • raster-saturation
  • raster-hue-rotate

Эти параметры задаются в paint-секции слоя.

Пример управления яркостью растрового слоя

map.setPaintProperty('satellite-layer', 'raster-brightness-min', 0.2);
map.setPaintProperty('satellite-layer', 'raster-brightness-max', 0.8);

Изменение диапазона min/max влияет на компрессию светлых и тёмных областей. Узкий диапазон делает изображение более «плоским», широкий — усиливает контраст между светом и тенью.

Коррекция контраста и насыщенности

map.setPaintProperty('satellite-layer', 'raster-contrast', 0.6);
map.setPaintProperty('satellite-layer', 'raster-saturation', -0.3);

Снижение насыщенности часто используется для подготовки карты под наложение ярких векторных данных.


Динамическая регулировка яркости через выражения

Mapbox GL JS поддерживает выражения, что позволяет управлять яркостью в зависимости от зума, времени суток или других параметров состояния карты.

Пример зависимости от масштаба

map.setPaintProperty('satellite-layer', 'raster-brightness-max', [
  'interpolate',
  ['linear'],
  ['zoom'],
  5, 0.6,
  10, 0.9,
  15, 1.0
]);

На низких уровнях масштабирования яркость снижается, чтобы уменьшить визуальный шум. При увеличении масштаба детализация возрастает, и допустимо более высокое значение яркости.


Освещение сцены и влияние на 3D-объекты

Векторные 3D-слои, такие как здания с fill-extrusion, используют модель сцены, включающую глобальное освещение.

В Mapbox GL JS существует объект light, который контролирует:

  • направление света
  • интенсивность
  • цвет освещения

Настройка света сцены

map.setLight({
  anchor: 'map',
  color: '#ffffff',
  intensity: 0.6,
  position: [1.5, 180, 80]
});

Параметр intensity оказывает прямое влияние на восприятие яркости вертикальных поверхностей зданий. При увеличении значения усиливаются блики и тени, создавая более контрастную сцену.

Управление направлением света

map.setLight({
  position: [1.2, 210, 60]
});

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


Яркость 3D-зданий (fill-extrusion)

Для 3D-геометрии яркость не задаётся напрямую, а формируется через взаимодействие цвета, прозрачности и освещения сцены.

Основные параметры:

  • fill-extrusion-color
  • fill-extrusion-opacity
  • fill-extrusion-ambient-occlusion-intensity
  • fill-extrusion-vertical-gradient

Пример настройки

map.setPaintProperty('buildings', 'fill-extrusion-color', '#aaa');
map.setPaintProperty('buildings', 'fill-extrusion-opacity', 0.9);
map.setPaintProperty('buildings', 'fill-extrusion-ambient-occlusion-intensity', 0.4);

Ambient occlusion добавляет затемнение в углублениях, усиливая ощущение глубины и косвенно снижая воспринимаемую яркость.


Атмосферные эффекты: небо и туман

Яркость сцены также зависит от фоновых слоёв:

  • sky
  • fog

Эти элементы формируют общий световой баланс карты.

Настройка неба

map.setFog({
  range: [0.5, 10],
  color: '#c9d5e3',
  'horizon-blend': 0.3
});

Чем выше плотность fog, тем сильнее визуальное рассеивание света, что снижает контраст и общую яркость сцены.

Изменение цвета неба

map.setFog({
  'space-color': '#0b1d2a',
  'star-intensity': 0.2
});

Тёмные значения создают эффект низкой освещённости, имитируя вечернее или ночное время.


Режимы «день/ночь» через стилевую трансформацию

В Mapbox GL JS нет единого переключателя яркости сцены, поэтому используется комбинация параметров.

Типичный подход:

  1. изменение растровых слоёв
  2. коррекция света сцены
  3. изменение fog
  4. корректировка цветовых палитр вектора

Пример ночного режима

function setNightMode(map) {
  map.setPaintProperty('satellite-layer', 'raster-brightness-max', 0.4);
  map.setPaintProperty('satellite-layer', 'raster-saturation', -0.2);

  map.setLight({
    intensity: 0.3,
    color: '#cfd8dc'
  });

  map.setFog({
    color: '#0a0f1a',
    'horizon-blend': 0.6
  });
}

Ночной режим достигается не снижением «общей яркости», а перераспределением световых характеристик между слоями.


Псевдоглобальная яркость через фильтрацию слоёв

Поскольку глобального параметра brightness не существует, часто применяется имитация через согласованное изменение нескольких слоёв.

Подход через raster + vector синхронизацию

const brightness = 0.5;

map.setPaintProperty('satellite-layer', 'raster-brightness-max', brightness);
map.setPaintProperty('water', 'fill-color', `rgba(0, 100, 200, ${brightness})`);
map.setPaintProperty('roads', 'line-opacity', brightness);

Такой подход создаёт единое визуальное восприятие яркости, несмотря на различие типов данных.


Управление яркостью через события карты

Динамическая корректировка часто привязывается к состоянию карты:

  • zoom
  • pitch
  • bearing
  • время суток (внешний таймер)

Пример адаптации к наклону камеры

map.on('pitch', () => {
  const pitch = map.getPitch();

  const intensity = Math.max(0.3, 1 - pitch / 60);

  map.setLight({
    intensity
  });
});

При увеличении наклона сцены свет уменьшается, компенсируя усиление теней.


Цветовые преобразования как инструмент управления яркостью

Помимо прямых параметров brightness, часто используются цветовые трансформации:

  • hue-rotate
  • contrast
  • saturation
  • gamma-подобные эффекты через экспоненциальные кривые

Пример комплексной коррекции

map.setPaintProperty('terrain', 'raster-saturation', -0.4);
map.setPaintProperty('terrain', 'raster-contrast', 0.8);
map.setPaintProperty('terrain', 'raster-brightness-min', 0.1);
map.setPaintProperty('terrain', 'raster-brightness-max', 0.9);

Комбинация этих параметров позволяет тонко управлять восприятием светотени без изменения данных источника.


Архитектурный принцип управления яркостью

В Mapbox GL JS яркость не является единым параметром. Она формируется как результат взаимодействия нескольких систем:

  • рендеринг растровых данных
  • стилизация векторных слоёв
  • физическая модель освещения
  • атмосферные эффекты
  • прозрачность и наложение слоёв

Такое разделение позволяет строить сложные визуальные режимы, где яркость становится производной характеристикой всей сцены, а не отдельным свойством.