RimLighting материал

В экосистеме 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-реализации вычисления строятся вокруг направления взгляда и нормали:

  1. Нормаль приводится к мировым координатам
  2. Вычисляется вектор взгляда от фрагмента к камере
  3. Считается косинус угла между ними
  4. Значение инвертируется для выделения краёв
  5. Применяется степень (power) для усиления контраста
  6. Итог умножается на цвет 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 → акцент и читаемость
  • комбинация → визуальная иерархия сцены

Он особенно эффективен в сценах с большим количеством объектов, где требуется быстрое различение форм без перегрузки деталями.