CesiumJS предоставляет систему низкоуровневого рендеринга через
примитивы (Primitive), где ключевую роль играет связка
GeometryInstance + Appearance. Одним из
наиболее производительных вариантов визуализации большого количества
однотипных геометрий является
PerInstanceColorAppearance.
PerInstanceColorAppearance предназначен для отображения
множества геометрических экземпляров, где каждый экземпляр имеет
собственный цвет, но при этом:
Ключевая идея заключается в том, что цвет не является частью материала, а хранится в данных экземпляра геометрии.
Cesium предоставляет несколько типов appearance. Наиболее часто сравниваются:
MaterialAppearance — материал задаётся через
procedural/material system;PerInstanceColorAppearance — цвет задаётся на уровне
экземпляра;EllipsoidSurfaceAppearance — специализированный вариант
для поверхности эллипсоида.Основные отличия:
MaterialAppearance
PerInstanceColorAppearance
Основная связка выглядит следующим образом:
GeometryInstance — описывает геометрию;PerInstanceColorAppearance — интерпретирует атрибут
цвета.Цвет задаётся через ColorGeometryInstanceAttribute:
Типичный паттерн включает создание массива экземпляров:
const instances = [];
for (let i = 0; i < 1000; i++) {
instances.push(
new Cesium.GeometryInstance({
geometry: new Cesium.BoxGeometry({
vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
maximum: new Cesium.Cartesian3(10000, 10000, 10000),
minimum: new Cesium.Cartesian3(-10000, -10000, -10000)
}),
modelMatrix: Cesium.Matrix4.multiplyByTranslation(
Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Cartesian3.fromDegrees(30 + i * 0.01, 50)
),
new Cesium.Cartesian3(0.0, 0.0, 0.0),
new Cesium.Matrix4()
),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
Cesium.Color.fromRandom({ alpha: 1.0 })
)
}
})
);
}
Далее все экземпляры передаются в Primitive:
const primitive = new Cesium.Primitive({
geometryInstances: instances,
appearance: new Cesium.PerInstanceColorAppearance({
flat: true,
translucent: false
})
});
PerInstanceColorAppearance.VERTEX_FORMAT включает:
Это означает, что цвет не интерполируется как материал, а применяется на уровне вершин/инстанса.
Шейдер PerInstanceColorAppearance минималистичен:
vertex shader:
fragment shader:
При flat: true интерполяция отключается, и используется
единый цвет на примитив.
Appearance конфигурирует render state:
В режиме translucent: false включается оптимизация depth
writing.
Параметр flat критически влияет на поведение:
flat: true
flat: false
Главное преимущество PerInstanceColorAppearance —
автоматический batching:
Это особенно эффективно для:
Несмотря на высокую производительность, существуют ограничения:
MaterialAppearance.При использовании прозрачности:
new Cesium.PerInstanceColorAppearance({
translucent: true
});
активируются:
Особенности:
PerInstanceColorAppearance совместим с большинством
встроенных геометрий:
Главное условие — поддержка
PerInstanceColorAppearance.VERTEX_FORMAT.
В высоконагруженных сценах структура обычно следующая:
PerInstanceColorAppearance чаще всего используется во
2-м слое как основной инструмент bulk-рендеринга.
Изменение цвета без пересоздания геометрии возможно через:
GeometryInstance.attributes.color;CallbackProperty в более высокоуровневых
API (через Entity слой).Однако прямое обновление instance attribute требует аккуратного управления буферами GPU.
MaterialAppearance вместо
PerInstanceColorAppearance для массовых объектов;vertexFormat у геометрии;Primitive;flat: true по умолчанию;PerInstanceColorAppearance напрямую соответствует WebGL
instancing подходу:
Это делает его одним из ключевых механизмов масштабируемой визуализации в CesiumJS.