Материал Checkerboard в CesiumJS представляет собой процедурный
шейдерный материал, создающий шахматный узор на поверхности геометрии за
счёт чередования двух цветов по пространственным координатам. В основе
реализации лежит система материалов Cesium, построенная вокруг описания
fabric, где задаются параметры GLSL-шейдера, входные
uniform-переменные и логика вычисления цвета пикселя.
Система материалов в CesiumJS опирается на унифицированную модель, где каждый материал описывается объектом с полями:
type — уникальный идентификатор материалаuniforms — набор параметров, доступных в шейдереsource — GLSL-код фрагментного шейдераtranslucent — признак прозрачности результатаCheckerboard материал является встроенным типом и доступен через
Cesium.Material.CheckerboardType.
Регистрация встроенного материала выполняется через фабрику материалов:
Cesium.Material._materialCache.addMaterial(Cesium.Material.CheckerboardType, {
fabric: {
type: Cesium.Material.CheckerboardType,
uniforms: {
evenColor: Cesium.Color.WHITE,
oddColor: Cesium.Color.BLACK,
repeat: new Cesium.Cartesian2(8.0, 8.0)
},
source: `
czm_material czm_getMaterial(czm_materialInput materialInput)
{
czm_material material = czm_getDefaultMaterial(materialInput);
vec2 st = materialInput.st * repeat;
float checker = step(0.5, mod(floor(st.s) + floor(st.t), 2.0));
vec4 color = mix(evenColor, oddColor, checker);
material.diffuse = color.rgb;
material.alpha = color.a;
return material;
}
`
},
translucent: function () {
return true;
}
});
Генерация узора основана на дискретизации UV-координат поверхности:
st (аналог
UV)repeatfloormod и step формируют бинарное
значениеМатематически логика может быть описана как:
[ checker = ( s r_x + t r_y ) ]
где ( r_x, r_y ) — коэффициенты повторения узора.
Checkerboard материал использует минимальный набор параметров:
evenColor — цвет «светлых» клетокoddColor — цвет «тёмных» клетокrepeat — масштаб сетки по осям S и TТипичный набор значений:
evenColor: Cesium.Color.fromCssColorString("#ffffff"),
oddColor: Cesium.Color.fromCssColorString("#2b2b2b"),
repeat: new Cesium.Cartesian2(10.0, 10.0)
Изменение repeat напрямую влияет на плотность узора:
увеличение значения приводит к уменьшению размеров клеток.
Checkerboard материал применяется к различным типам геометрии:
const entity = viewer.entities.add({
polygon: {
hierarchy: Cesium.Cartesian3.fromDegreesArray([
30, 10,
40, 10,
40, 20,
30, 20
]),
material: new Cesium.CheckerboardMaterialProperty({
evenColor: Cesium.Color.YELLOW,
oddColor: Cesium.Color.BLUE,
repeat: new Cesium.Cartesian2(5, 5)
})
}
});
Здесь используется CheckerboardMaterialProperty,
обеспечивающий реактивное обновление материала при изменении
свойств.
viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(0, 0),
ellipsoid: {
radii: new Cesium.Cartesian3(1000000, 1000000, 1000000),
material: new Cesium.CheckerboardMaterialProperty({
evenColor: Cesium.Color.WHITE,
oddColor: Cesium.Color.RED,
repeat: new Cesium.Cartesian2(20, 20)
})
}
});
На криволинейных поверхностях искажения узора зависят от параметризации UV, что может приводить к неравномерной геометрии клеток в полярных областях.
Класс CheckerboardMaterialProperty реализует интерфейс
MaterialProperty, позволяя динамически пересчитывать
uniform-параметры.
Основные методы:
getType() — возвращает тип материалаgetValue(time, result) — обновляет значения
uniformsequals(other) — сравнение свойствПример логики обновления:
CheckerboardMaterialProperty.prototype.getValue = function (time, result) {
result.evenColor = this._evenColor;
result.oddColor = this._oddColor;
result.repeat = this._repeat;
return result;
};
Это позволяет интегрировать материал в систему анимации Cesium, где значения могут изменяться во времени.
Фрагментный шейдер Checkerboard основан на стандартных GLSL-функциях Cesium:
floor — дискретизация координатmod — вычисление остаткаstep — бинарное сравнениеmix — линейная интерполяция цветовКлючевая особенность заключается в отсутствии ветвлений
if, что повышает производительность на GPU:
float checker = step(0.5, mod(floor(st.s) + floor(st.t), 2.0));
vec4 color = mix(evenColor, oddColor, checker);
Использование mix вместо условных операторов снижает
вероятность divergence в потоках GPU.
Поведение checkerboard зависит от нескольких факторов:
UV-развёртка геометрии Неправильная параметризация приводит к растяжению клеток.
Масштаб модели При трансформациях в мировом пространстве узор остаётся привязан к локальным координатам.
Проекция на кривые поверхности На сферах наблюдается сжатие клеток у полюсов из-за особенностей сферической UV-развёртки.
LOD и тайлы Cesium terrain При смене уровней детализации может наблюдаться скачкообразное изменение плотности узора, если материал привязан к геометрии тайла.
Checkerboard материал относится к категории дешёвых процедурных материалов:
texture2D)Основные затраты связаны исключительно с количеством фрагментов, а не сложностью вычислений.
На больших сценах узор может применяться без существенного влияния на FPS, что делает его подходящим для:
В системе Cesium возможно объединение материалов через композицию или кастомные шейдеры. Checkerboard часто используется как базовый слой:
Пример комбинирования:
material: new Cesium.Material({
fabric: {
type: "Checkerboard",
uniforms: {
evenColor: Cesium.Color.WHITE.withAlpha(0.8),
oddColor: Cesium.Color.GRAY.withAlpha(0.8),
repeat: new Cesium.Cartesian2(15, 15)
}
}
});
Изменение параметров в рантайме приводит к немедленной перекомпиляции uniform-значений без пересборки шейдера:
material.uniforms.repeat = new Cesium.Cartesian2(30, 30);
material.uniforms.evenColor = Cesium.Color.GREEN;
Это возможно благодаря разделению shader source и uniform state в архитектуре материалов.
Несмотря на простоту, checkerboard материал имеет ряд ограничений:
Эти ограничения обусловлены тем, что материал работает на уровне фрагментного шейдера и не имеет информации о глобальной геометрической структуре сцены.