Текстурное сэмплирование определяет способ, которым GPU извлекает цветовые значения из изображений при наложении их на геометрию. В контексте CesiumJS это критически важный механизм, поскольку практически вся визуализация — от тайлов карт до 3D-моделей и эффектов освещения — опирается на работу текстур.
Текстура в WebGL представляется как двумерный массив пикселей, а координаты UV используются для доступа к этим пикселям. Сэмплер задаёт правила интерпретации координат и алгоритмы интерполяции при масштабировании.
Каждая текстура в CesiumJS привязывается к поверхности через UV-координаты в диапазоне:
Классическое отображение:
Однако реальные значения UV могут выходить за пределы диапазона, что приводит к поведению, заданному режимами wrap (обёртки).
Wrap mode определяет, как GPU обрабатывает координаты вне диапазона [0, 1].
Значение фиксируется на краях текстуры:
Используется для:
Типичное поведение в CesiumJS для ImageryLayer:
new Cesium.TextureUniform({
wrapS: Cesium.TextureWrap.CLAMP_TO_EDGE,
wrapT: Cesium.TextureWrap.CLAMP_TO_EDGE
});
Текстура повторяется по бесконечной сетке:
Применяется для:
wrapS: Cesium.TextureWrap.REPEAT,
wrapT: Cesium.TextureWrap.REPEAT
Повтор с зеркалированием:
Используется для устранения видимых швов при тайлинге.
Фильтрация определяет, как вычисляется цвет пикселя при несоответствии координат texel-пикселям.
Простейший метод:
Используется для:
magFilter: Cesium.TextureMagnificationFilter.NEAREST
Интерполяция между соседними пикселями:
Основной режим в CesiumJS для карт и спутниковых данных.
magFilter: Cesium.TextureMagnificationFilter.LINEAR
Mipmaps — это набор уменьшенных копий текстуры:
Используются при отдалении камеры для:
Минимизационный фильтр:
minFilter: Cesium.TextureMinificationFilter.LINEAR_MIPMAP_LINEAR
При наклонном просмотре поверхности текстура искажается: один пиксель камеры покрывает вытянутую область текстуры.
Anisotropic filtering компенсирует это, улучшая резкость под углом.
В CesiumJS степень анизотропии зависит от GPU:
maximumAnisotropy: viewer.scene.maximumTextureAnisotropy
Практическое влияние:
Cesium абстрагирует WebGL sampler через объект Sampler:
const sampler = new Cesium.Sampler({
wrapS: Cesium.WrapMode.REPEAT,
wrapT: Cesium.WrapMode.REPEAT,
minificationFilter: Cesium.TextureMinificationFilter.LINEAR,
magnificationFilter: Cesium.TextureMagnificationFilter.LINEAR
});
Этот sampler применяется к:
Imagery layers — основной источник текстур в CesiumJS.
Каждый тайл:
Пример настройки:
const layer = new Cesium.ImageryLayer(provider, {
maximumAnisotropy: 8,
minificationFilter: Cesium.TextureMinificationFilter.LINEAR_MIPMAP_LINEAR,
magnificationFilter: Cesium.TextureMagnificationFilter.LINEAR
});
Особенности:
Процесс загрузки:
Важно:
Ошибки конфигурации приводят к артефактам:
В 3D Tiles текстурирование работает через PBR-материалы:
Каждая текстура использует собственный sampler:
{
"texture": {
"sampler": 0,
"source": 0
}
}
Ключевые особенности:
CesiumJS позволяет переопределять sampling через GLSL:
vec4 color = texture2D(u_texture, v_st);
Сэмплирование здесь зависит от:
Можно управлять уровнем детализации вручную:
texture2DLodEXT(u_texture, v_st, lod);
Практически важные правила:
Факторы, влияющие на sampling:
Cesium автоматически адаптирует параметры, но ручная настройка часто необходима для крупных сцен и кастомных материалов.