В экосистеме CesiumJS материал RimLighting относится к категории
процедурных материалов, реализующих эффект ободкового освещения (rim
lighting), при котором края объекта подсвечиваются в зависимости от угла
между нормалью поверхности и направлением на камеру. Такой подход
усиливает визуальное отделение объектов от фона и добавляет им
объёмность даже при минимальной геометрической детализации.
Физический смысл rim
lighting
Rim lighting основан на вычислении скалярного произведения между:
- нормалью поверхности N
- направлением взгляда V
Классическая модель:
- при совпадении направления взгляда и нормали поверхность выглядит
менее освещённой
- при приближении угла к 90° (края объекта) интенсивность свечения
увеличивается
Математически это выражается через:
dot(N, V)
- инверсию или степенную функцию для усиления эффекта
Идея сводится к усилению яркости по краям объекта, создавая эффект
«ореола».
Место RimLighting
в системе материалов Cesium
В CesiumJS материалы реализуются как процедурные шейдеры,
подключаемые к:
Material
MaterialProperty
Appearance
RimLighting является встроенным типом материала и используется в
контексте:
Entity API
- геометрий с поддержкой appearance/material system
- примитивов с пользовательскими материалами
Основные параметры
RimLightingMaterial
Типичный набор свойств материала включает:
Цвет свечения (color)
Определяет оттенок ободкового свечения.
- используется для визуального выделения объектов
- часто задаётся в формате RGBA
Радиус или интенсивность
(rimPower)
Контролирует резкость и ширину светового ореола:
- низкие значения → мягкое, широкое свечение
- высокие значения → узкий, ярко выраженный контур
Альфа-канал
Влияет на прозрачность эффекта:
- позволяет смешивать rim lighting с базовой заливкой
- используется в композиции материалов
Принцип работы в шейдере
Внутри GLSL-реализации вычисления строятся вокруг направления взгляда
и нормали:
- Нормаль приводится к мировым координатам
- Вычисляется вектор взгляда от фрагмента к камере
- Считается косинус угла между ними
- Значение инвертируется для выделения краёв
- Применяется степень (power) для усиления контраста
- Итог умножается на цвет rim lighting
Упрощённая логика:
rim = 1.0 - max(dot(normal, viewDirection), 0.0)
rim = pow(rim, rimPower)
finalColor += rim * rimColor
Использование через Entity
API
RimLighting применяется через материал свойства объекта:
const entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(30.5, 50.4, 0),
ellipsoid: {
radii: new Cesium.Cartesian3(100000.0, 100000.0, 100000.0),
material: Cesium.Material.fromType('RimLighting', {
color: Cesium.Color.CYAN,
rimPower: 3.0
})
}
});
В данном случае:
- создаётся эллипсоид
- применяется материал RimLighting
- объект получает выраженный светящийся контур
Использование через
MaterialProperty
В динамических сценах RimLighting часто задаётся через
property-систему:
entity.ellipsoid.material = new Cesium.RimLightingMaterialProperty({
color: new Cesium.Color(0.2, 0.8, 1.0, 1.0),
rimPower: 4.0
});
Такой подход позволяет:
- изменять параметры во времени
- привязывать материал к анимации
- использовать реактивные данные
Поведение при изменении
угла камеры
RimLighting сильно зависит от положения камеры:
- при фронтальном взгляде эффект минимален
- при боковом обзоре интенсивность максимальна
- при вращении сцены контур динамически перераспределяется
Это делает материал особенно полезным для:
- визуализации объектов на глобусе
- выделения маркеров
- подсветки зон интереса
Оптимизационные особенности
RimLighting относится к относительно лёгким шейдерным эффектам,
однако имеет особенности:
Зависимость от количества
фрагментов
- чем выше детализация геометрии, тем точнее контур
- на низкополигональных объектах эффект может быть угловатым
Отсутствие сложного
освещения
- не требует вычисления теней
- не использует глобальные источники света
- работает только с нормалями и камерой
Комбинирование с другими
материалами
RimLighting часто используется как часть многослойного визуального
стека:
С прозрачными материалами
- добавление ореола к полупрозрачным объектам
- усиление читаемости объектов над картой
С текстурными материалами
- текстура остаётся базовым слоем
- rim lighting добавляется как обводка
С цветовой анимацией
- динамическое изменение rimColor
- пульсация эффекта через time uniform
Типичные сценарии применения
Геопространственные маркеры
- выделение точек интереса
- акцентирование объектов на глобусе
Визуализация зон
- подсветка областей покрытия
- выделение границ регионов
Интерфейсные элементы в
3D-сцене
- указатели
- интерактивные объекты
- навигационные элементы
Ограничения модели
RimLighting
Несмотря на визуальную выразительность, материал имеет ряд
ограничений:
- не заменяет полноценное физически корректное освещение
- чувствителен к качеству нормалей
- может терять выразительность на сложной геометрии
- не учитывает глобальные источники света сцены
Шейдерная интеграция в
Material систему
Внутренне RimLighting реализуется через систему MaterialType:
- регистрируется как встроенный тип
- подключает fragment shader snippet
- использует uniform-параметры для color и power
Принцип интеграции:
- Cesium Material Pipeline
- Material Appearance system
- Shader source injection
Поведение при изменении
масштаба сцены
Особенность CesiumJS заключается в глобальном масштабе координат,
поэтому rim lighting:
- остаётся стабильным при изменении zoom
- зависит только от локальной геометрии
- не привязан к размеру карты
Это делает его предсказуемым в геопространственных сценах.
Практическая роль в
визуальной иерархии
RimLighting часто выступает как слой визуального выделения:
- базовый цвет объекта → семантика
- rim lighting → акцент и читаемость
- комбинация → визуальная иерархия сцены
Он особенно эффективен в сценах с большим количеством объектов, где
требуется быстрое различение форм без перегрузки деталями.