Текстурирование в контексте WebGL и Deck.gl основано на наложении растрового изображения на геометрическую поверхность с использованием UV-координат. Для полигонов это означает, что каждая вершина получает набор координат (u, v), определяющих, как пиксели текстуры проецируются на поверхность.
В Deck.gl текстурирование чаще всего реализуется через слой PolygonLayer, который поддерживает как простую заливку цветом, так и использование изображений в качестве материала поверхности. Текстура интерпретируется как двумерный массив данных, который «оборачивается» по площади полигона согласно правилам UV-развёртки.
Ключевые свойства:
PolygonLayer в Deck.gl опирается на три ключевых этапа обработки данных:
Тесселяция полигонов Любой полигон (включая GeoJSON) преобразуется в набор треугольников. Это необходимо, поскольку GPU работает с треугольной геометрией.
Генерация атрибутов вершин Для каждой вершины формируются:
Шейдерная отрисовка В фрагментном шейдере происходит выборка текстуры:
Текстура задаётся через параметр image или через
кастомные свойства материала слоя.
Пример базовой конфигурации:
import {PolygonLayer} from '@deck.gl/layers';
const layer = new PolygonLayer({
id: 'textured-polygons',
data: polygons,
getPolygon: d => d.coordinates,
getFillColor: [255, 255, 255],
image: 'https://example.com/texture.png',
filled: true,
stroked: false
});
В этом случае изображение используется как глобальная текстура, которая накладывается на все полигоны слоя.
В PolygonLayer UV-координаты не всегда задаются вручную. Вместо этого используется автоматическая генерация, основанная на геометрии.
Основные стратегии:
Каждый полигон масштабируется в единичный квадрат:
Недостаток — искажения при вытянутых геометриях.
При использовании GeoJsonLayer и координатных систем вроде
LNGLAT UV может быть привязан к географическим
координатам:
Такой подход сохраняет глобальную согласованность текстур, но приводит к растяжениям ближе к полюсам.
Текстура повторяется по пространству с заданным масштабом:
position * scaleFactor;Поведение текстуры контролируется параметрами WebGL sampler-а:
wrapS = REPEATwrapT = REPEATminFilter и magFilter влияют на
сглаживаниеВ Deck.gl это обычно задаётся через
textureParameters:
const layer = new PolygonLayer({
id: 'repeating-texture',
data,
image: textureUrl,
textureParameters: {
[GL.TEXTURE_WRAP_S]: GL.REPEAT,
[GL.TEXTURE_WRAP_T]: GL.REPEAT
}
});
GeoJsonLayer расширяет PolygonLayer и добавляет поддержку сложных геометрий. Текстурирование в нём работает аналогично, но с дополнительными этапами обработки:
Особенность заключается в том, что разные feature могут использовать одну и ту же текстуру, но с независимой трансформацией.
Для более сложного контроля применяется getShaderModule
или extensions.
Фрагментный шейдер может переопределять поведение выборки:
uniform sampler2D texture;
varying vec2 vUV;
void main() {
vec4 texColor = texture2D(texture, vUV);
gl_FragColor = vec4(texColor.rgb * 0.8, texColor.a);
}
Возможные модификации:
Deck.gl позволяет использовать разные текстуры для разных объектов:
getTexture: d => d.textureUrl
В этом случае каждая геометрия может иметь собственный image.
Особенности реализации:
Для повышения производительности используется texture atlas — единое изображение, содержащее множество под-текстур.
Преимущества:
UV в этом случае рассчитываются с учётом смещения:
u' = u * scaleX + offsetX
v' = v * scaleY + offsetY
При наложении текстур важную роль играет blending:
Deck.gl использует стандартные WebGL режимы:
SRC_ALPHA / ONE_MINUS_SRC_ALPHA для обычной
прозрачности;ONE / ONE для усиления свечения.Типичные проблемы текстурирования полигонов:
Возникает при неравномерной геометрии. Решается:
Появляются при повторяющихся текстурах:
Причины:
Текстуры увеличивают нагрузку на GPU, особенно при большом количестве полигонов.
Оптимизационные стратегии:
binary attributes для ускорения передачи
данных.В геопространственных приложениях текстуры часто адаптируются к уровню масштаба:
UV может модифицироваться как функция zoom:
uv = position * 2^zoomFactor
Хотя PolygonLayer по умолчанию не является физически корректным рендерером материалов, текстуры могут комбинироваться с освещением:
В более сложных сценах применяется комбинирование с LightingEffect.
Deck.gl поддерживает наложение нескольких слоёв:
Композиция выполняется через порядок рендеринга и blending state.
При моделировании картографических поверхностей текстуры часто используются для:
Каждый случай требует настройки UV и blending под конкретную задачу визуализации.