В системе рендеринга CesiumJS ключевую роль в формировании внешнего вида геометрии играет механизм Appearance. Он определяет, каким образом вершины, индексы и материалы превращаются в пиксели на экране. MaterialAppearance является одной из наиболее гибких реализаций этого механизма, предоставляя прямую интеграцию с системой материалов и шейдерной моделью Cesium.
MaterialAppearance используется совместно с Primitive и Geometry, формируя связку, в которой геометрия отвечает за форму, а appearance — за визуальное представление. В отличие от более простых вариантов, таких как EllipsoidSurfaceAppearance, MaterialAppearance не ограничен конкретным типом геометрии и рассчитан на универсальное применение.
MaterialAppearance представляет собой слой абстракции над GLSL-шейдерами, автоматически генерируемыми на основе материала (Material) и параметров геометрии. Основная идея заключается в разделении логики:
MaterialAppearance не содержит фиксированного шейдера. Вместо этого он динамически компилирует fragment shader на основе описания материала и uniform-параметров.
Типичная связка выглядит следующим образом:
const material = Cesium.Material.fromType("Color");
const appearance = new Cesium.MaterialAppearance({
material: material,
faceForward: true,
translucent: false
});
const primitive = new Cesium.Primitive({
geometryInstances: new Cesium.GeometryInstance({
geometry: new Cesium.RectangleGeometry({
rectangle: Cesium.Rectangle.fromDegrees(-80, 20, -70, 30),
vertexFormat: Cesium.EllipsoidSurfaceAppearance.VERTEX_FORMAT
})
}),
appearance: appearance
});
viewer.scene.primitives.add(primitive);
В этом примере MaterialAppearance управляет тем, как прямоугольная геометрия будет окрашена и отрисована, используя стандартный материал Color.
Material является центральным элементом системы внешнего вида. Он описывает поведение поверхности через набор uniform-переменных и процедурных функций.
MaterialAppearance принимает объект Material, который может быть:
В момент компиляции шейдера Cesium преобразует материал в GLSL-код, который вставляется в fragment pipeline.
Пример использования текстурного материала:
const material = new Cesium.Material({
fabric: {
type: "Image",
uniforms: {
image: "texture.png"
}
}
});
MaterialAppearance затем использует этот материал как источник цвета пикселя.
Свойство faceForward управляет поведением при рендеринге граней, ориентированных от камеры. При включении:
Это особенно важно для тонких поверхностей, таких как стены или полигоны без объёма.
new Cesium.MaterialAppearance({
faceForward: true
});
Параметр translucent определяет, будет ли поверхность участвовать в alpha blending.
MaterialAppearance автоматически влияет на выбор render state:
new Cesium.MaterialAppearance({
translucent: true
});
При включении прозрачности Cesium активирует blending:
и добавляет объект в очередь прозрачных примитивов.
Свойство flat отключает освещение на поверхности. В этом режиме:
new Cesium.MaterialAppearance({
flat: true
});
Flat-режим используется для аналитической визуализации, тепловых карт и 2D-подобных слоёв.
MaterialAppearance тесно связан с VertexFormat, который определяет, какие атрибуты будут переданы в шейдер:
Несовпадение VertexFormat между Geometry и Appearance приводит к некорректному рендерингу.
Пример согласования:
geometry: new Cesium.RectangleGeometry({
rectangle: rect,
vertexFormat: Cesium.VertexFormat.ALL
})
MaterialAppearance при этом ожидает наличие соответствующих атрибутов для корректного освещения и текстурирования.
MaterialAppearance позволяет переопределять renderState — набор параметров WebGL контекста:
Пример:
new Cesium.MaterialAppearance({
renderState: {
depthTest: {
enabled: true
},
cull: {
enabled: true,
face: Cesium.CullFace.BACK
}
}
});
Эта возможность делает MaterialAppearance инструментом не только визуального уровня, но и управления поведением GPU.
MaterialAppearance не хранит статический fragment shader. Вместо этого происходит генерация:
Fragment shader включает:
Vertex shader обычно остаётся стандартным, но может модифицироваться через VertexFormat.
MaterialAppearance поддерживает освещение Cesium, включая:
Если материал не отключает lighting, вычисления выполняются в view space:
MaterialAppearance является одним из наиболее гибких, но и более дорогих вариантов appearance.
Основные факторы нагрузки:
Оптимизационные подходы:
MaterialAppearance поддерживает сложные материалы через fabric composition:
Пример комбинированного материала:
const material = new Cesium.Material({
fabric: {
type: "Composite",
materials: {
base: {
type: "Color"
},
detail: {
type: "Image",
uniforms: {
image: "detail.png"
}
}
},
components: {
diffuse: "base.color * detail.color"
}
}
});
MaterialAppearance интерпретирует такую структуру как единый shader pipeline.
Внутри Primitive pipeline MaterialAppearance выполняет следующие этапы:
Таким образом, MaterialAppearance выступает связующим звеном между абстрактной геометрией и низкоуровневым GPU-рендерингом.