При визуализации трёхмерных сцен важную роль играет не только геометрия объектов, но и их внешний вид. Текстуры позволяют накладывать изображения на поверхности моделей, примитивов и геометрических объектов, а шаблоны используются для создания повторяющихся графических узоров, масок и специализированных визуальных эффектов.
В CesiumJS текстурирование применяется в нескольких направлениях:
Текстура представляет собой двумерное изображение, которое проецируется на поверхность объекта.
Наиболее распространённые форматы:
С точки зрения WebGL текстура является специальным объектом видеопамяти, содержащим массив пикселей.
В CesiumJS большая часть работы с текстурами скрыта за высокоуровневыми API, однако понимание механизма остаётся важным.
Типичная схема работы выглядит следующим образом:
Самый простой способ применения текстуры — использование материала
типа ImageMaterialProperty.
const viewer = new Cesium.Viewer("cesiumContainer");
viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
30.0, 50.0,
31.0, 50.0,
31.0, 51.0,
30.0, 51.0
]),
material: new Cesium.ImageMaterialProperty({
image: "textures/brick.jpg"
})
}
});
В результате изображение будет распределено по всей площади полигона.
По умолчанию текстура растягивается на всю поверхность объекта. Часто требуется многократное повторение изображения.
Для этого используется параметр repeat.
material: new Cesium.ImageMaterialProperty({
image: "textures/tile.png",
repeat: new Cesium.Cartesian2(10, 10)
})
Здесь изображение будет повторено:
Такой подход применяется при создании:
Текстуры формата PNG могут содержать альфа-канал.
Пример:
material: new Cesium.ImageMaterialProperty({
image: "textures/logo.png",
transparent: true
})
Параметр transparent сообщает движку о необходимости
учитывать прозрачные пиксели.
Подобная техника используется для:
Текстуру можно окрашивать поверх исходного изображения.
material: new Cesium.ImageMaterialProperty({
image: "textures/grid.png",
color: Cesium.Color.RED
})
Текстура остаётся видимой, но её цвета смешиваются с указанным оттенком.
Применение:
Прямоугольники являются одним из наиболее популярных объектов для отображения изображений.
viewer.entities.add({
rectangle: {
coordinates: Cesium.Rectangle.fromDegrees(
30.0,
50.0,
31.0,
51.0
),
material: "images/aerial.jpg"
}
});
В данном случае растровое изображение накладывается непосредственно на поверхность Земли.
Подобный механизм применяется для:
Текстуры могут использоваться не только на прямоугольниках.
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(30, 50),
ellipse: {
semiMajorAxis: 50000,
semiMinorAxis: 30000,
material: new Cesium.ImageMaterialProperty({
image: "textures/radar.png"
})
}
});
Часто подобный подход используется для отображения:
Для создания сетчатых шаблонов существует встроенный материал Grid.
material: new Cesium.GridMaterialProperty({
color: Cesium.Color.WHITE,
cellAlpha: 0.2,
lineCount: new Cesium.Cartesian2(20, 20)
})
Параметры:
| Параметр | Назначение |
|---|---|
| color | Цвет линий |
| cellAlpha | Прозрачность ячеек |
| lineCount | Количество линий |
| lineThickness | Толщина линий |
Применение:
Материал Stripe создаёт повторяющиеся полосы.
material: new Cesium.StripeMaterialProperty({
evenColor: Cesium.Color.YELLOW,
oddColor: Cesium.Color.BLACK,
repeat: 20
})
Получается чередующийся узор.
Использование:
Шахматный шаблон формируется через Checkerboard.
material: new Cesium.CheckerboardMaterialProperty({
evenColor: Cesium.Color.WHITE,
oddColor: Cesium.Color.GRAY,
repeat: new Cesium.Cartesian2(8, 8)
})
Такой материал полезен для:
Для линий доступен специальный текстурированный эффект свечения.
viewer.entities.add({
polyline: {
positions: Cesium.Cartesian3.fromDegreesArray([
30, 50,
35, 52
]),
width: 8,
material: new Cesium.PolylineGlowMaterialProperty({
glowPower: 0.3,
color: Cesium.Color.CYAN
})
}
});
Эффект напоминает текстурированную светящуюся ленту.
Применяется для:
Материал создаёт контур вокруг линии.
material: new Cesium.PolylineOutlineMaterialProperty({
color: Cesium.Color.YELLOW,
outlineColor: Cesium.Color.BLACK,
outlineWidth: 2
})
Результатом становится более контрастное отображение объектов на сложном фоне.
Материалы Cesium поддерживают смешивание нескольких визуальных параметров.
Пример:
material: new Cesium.ImageMaterialProperty({
image: "textures/grid.png",
color: Cesium.Color.BLUE.withAlpha(0.5),
transparent: true
})
В данном случае одновременно используются:
Такой подход значительно расширяет возможности оформления сцены.
Большинство форматов трёхмерных моделей уже содержат текстуры.
Особенно это касается формата glTF.
Структура обычно включает:
model.gltf
textures/
├─ baseColor.png
├─ normal.png
├─ metallic.png
└─ roughness.png
Загрузка модели:
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(30, 50),
model: {
uri: "models/building.glb"
}
});
Cesium автоматически:
Современный glTF использует физически корректный рендеринг (PBR).
Основные карты:
| Карта | Назначение |
|---|---|
| Base Color | Основной цвет |
| Normal Map | Имитация рельефа |
| Metallic | Металличность |
| Roughness | Шероховатость |
| Emissive | Самосвечение |
| Occlusion | Затенение |
Cesium полностью поддерживает данные текстуры в моделях glTF и GLB.
Normal Map создаёт иллюзию мелких деталей без усложнения геометрии.
Например:
Фактическое количество полигонов остаётся неизменным, однако освещение воспринимает поверхность как более сложную.
Это значительно повышает производительность по сравнению с моделированием каждой детали.
Крупные проекты могут содержать сотни мегабайт текстур.
Для снижения нагрузки используются сжатые форматы:
Преимущества:
Современные версии Cesium активно используют подобные форматы при работе с большими 3D Tiles наборами данных.
Cesium предоставляет систему Fabric для создания собственных материалов.
Простейший пример:
const material = new Cesium.Material({
fabric: {
type: "Color",
uniforms: {
color: Cesium.Color.RED
}
}
});
Fabric является надстройкой над GLSL-шейдерами.
Через неё можно создавать:
Не все текстуры должны храниться в файлах.
Многие шаблоны генерируются математически.
Примером являются:
Преимущества процедурного подхода:
Текстуры могут изменяться во времени.
Примером являются:
Обычно анимация реализуется через изменение координат выборки текстуры внутри шейдера.
Упрощённая схема:
vec2 uv = materialInput.st;
uv.x += time * speed;
В результате создаётся иллюзия движения изображения по поверхности.
Для корректного отображения изображения используются UV-координаты.
Они определяют соответствие:
Вершина модели → Точка текстуры
Диапазон значений:
U = 0..1
V = 0..1
Пример:
(0,0) левый нижний угол
(1,0) правый нижний угол
(1,1) правый верхний угол
(0,1) левый верхний угол
Ошибки UV-развёртки приводят к:
Размер текстур ограничивается возможностями видеокарты.
Типичные значения:
4096 × 4096
8192 × 8192
16384 × 16384
Проверка выполняется через WebGL.
Для крупных сцен рекомендуется:
Mipmaps представляют собой набор уменьшенных копий текстуры.
Например:
1024x1024
512x512
256x256
128x128
64x64
...
Преимущества:
Большинство текстур в Cesium используют mipmaps автоматически.
Наборы 3D Tiles активно используют текстурирование.
Каждый тайл может содержать:
При перемещении камеры Cesium:
Благодаря этому возможно отображение:
При работе с крупными проектами рекомендуется придерживаться нескольких правил.
Использование степени двойки
Предпочтительные размеры:
256
512
1024
2048
4096
Минимизация количества файлов
Лучше использовать атласы текстур вместо множества мелких изображений.
Использование сжатия
Форматы KTX2 позволяют существенно сократить объём ресурсов.
Повторное использование материалов
Одинаковые текстуры желательно разделять между объектами.
Контроль разрешения
Текстуры сверхвысокого качества следует применять только там, где это действительно необходимо.
Грамотная работа с шаблонами и текстурами позволяет создавать в CesiumJS реалистичные трёхмерные сцены, сложные визуальные эффекты, высокодетализированные модели и производительные геоинформационные приложения, способные эффективно отображать большие объёмы пространственных данных.