В WebGL-пайплайне Deck.gl текстура представляет собой GPU-ресурс, который может быть создан из изображения, видео, массива пикселей или процедурно сгенерированного буфера. При этом ключевая особенность Deck.gl заключается в том, что текстура не обязана быть статическим ассетом — она может обновляться на каждом кадре или пересоздаваться при изменении состояния данных.
В типичном сценарии текстуры используются в слоях:
BitmapLayer — отображение растровых изображений на
геопространственной поверхностиIconLayer — спрайтовые атласы и иконкиTileLayer — тайловые изображения картLayer APIДинамическое создание текстур особенно важно для визуализаций, где изображение формируется на основе данных в реальном времени: тепловые карты, симуляции, пользовательские графики, визуальные эффекты.
Наиболее распространённый подход — использование
<canvas> как промежуточного буфера:
Ключевая особенность — canvas становится источником пикселей, которые могут пересоздаваться на лету.
Типовой сценарий:
image в слойDeck.gl автоматически конвертирует canvas в GPU texture через WebGL контекст.
Более производительный вариант — использование
ImageBitmap:
createImageBitmapПайплайн:
Canvas → ImageBitmap → Texture2D → GPU
Этот подход особенно эффективен при частых обновлениях текстур.
Для максимального контроля используется Uint8Array или
Float32Array:
Такой способ применяется в симуляциях (физика, диффузия, клеточные автоматы).
BitmapLayer является базовым инструментом отображения
текстуры на геометрии (обычно — прямоугольник на карте).
Динамическое обновление достигается через изменение свойства
image.
Принцип работы:
image слой пересоздаёт WebGL textureКлючевой момент — изменение ссылки на объект изображения:
Deck.gl не отслеживает изменения внутри canvas, только смену ссылки.
Механизм updateTriggers позволяет контролировать, когда
пересчитываются accessors и обновляются данные слоя.
В контексте текстур это используется косвенно:
Пример логики:
Важно понимать, что updateTriggers не обновляет
GPU-текстуру напрямую, но управляет моментом пересоздания входных
данных.
Процедурные текстуры формируются без исходного изображения.
Типовые алгоритмы:
Canvas используется как промежуточный рендер:
Ключевая особенность — детерминированность или зависимость от времени
t.
Динамические текстуры часто требуют обновления каждый кадр.
Схема:
requestAnimationFrameВарианты обновления:
deck.setPropssetNeedsRedraw(true)Частота обновления напрямую влияет на нагрузку GPU:
Для полного контроля над текстурами используется наследование от
Layer.
Внутри жизненного цикла:
initializeState — создание WebGL ресурсовupdateState — обновление текстурных данныхdraw — привязка текстуры к шейдерамWebGL-объект Texture2D (из luma.gl) позволяет:
setImageDataПример логики:
Это критически важно для производительности.
Пересоздание текстуры — дорогая операция. Основные оптимизации:
needsUpdateХотя атласы чаще используются в IconLayer, они также
применимы к динамической генерации:
Преимущества:
Видео может использоваться как динамическая текстура:
<video> элемент как источникDeck.gl обновляет texture при каждом новом кадре видео.
Использование:
Deck.gl не детектирует внутренние изменения canvas, если ссылка не меняется.
Приводит к:
Неконтролируемый requestAnimationFrame без throttling
вызывает:
Динамические текстуры применяются в слоях:
Ключевой принцип — текстура перестаёт быть статичным изображением и становится вычисляемым состоянием системы рендеринга.