HDR рендеринг

В классическом рендеринге изображения ограничены диапазоном 0–1, где значения яркости жёстко «обрезаются» при выходе за пределы. Такой подход упрощает вычисления, но приводит к потере деталей в ярких участках и отсутствию реалистичной адаптации освещения. HDR (High Dynamic Range) рендеринг решает эту проблему за счёт хранения и обработки значений яркости в расширенном диапазоне, превышающем стандартные ограничения.

В CesiumJS HDR используется как часть общей системы физически корректного рендеринга (PBR), влияя на отображение неба, освещения, отражений и материалов.


Архитектура HDR-пайплайна в CesiumJS

HDR в CesiumJS встроен в рендеринг сцены и тесно связан с несколькими подсистемами:

  • физически корректное освещение (PBR)
  • тональная компрессия (tone mapping)
  • постобработка изображения
  • атмосфера и небо
  • отражения и environment maps

Ключевая идея: сцена сначала рендерится в HDR-буфер с плавающей точкой, после чего преобразуется в LDR-изображение для отображения на экране.


Включение HDR-рендеринга

Основной переключатель HDR находится в объекте сцены:

const viewer = new Cesium.Viewer("cesiumContainer");

viewer.scene.highDynamicRange = true;

При включении:

  • рендеринг переводится в float framebuffer (обычно RGBA16F или RGBA32F)
  • активируется тональная компрессия
  • усиливается корректность бликов и источников света
  • корректируются отражения в PBR-материалах

Отключение возвращает классический LDR-пайплайн:

viewer.scene.highDynamicRange = false;

Роль тональной компрессии

HDR-буфер содержит значения яркости, которые выходят за пределы дисплея. Чтобы визуализировать такие данные, применяется тональная компрессия.

В CesiumJS используется встроенный tone mapping, который:

  • сжимает яркие участки без потери деталей
  • сохраняет контраст в средних тонах
  • предотвращает «пересвет» неба и солнца

Фактически pipeline выглядит так:

  1. вычисление освещения в HDR
  2. применение tone mapping
  3. gamma correction
  4. вывод на экран

Взаимодействие HDR и физически корректных материалов

HDR особенно важен для PBR-материалов glTF, так как их модель отражения основана на реальных физических значениях.

В таких материалах:

  • металлы отражают свет с высокой интенсивностью
  • диэлектрики имеют ограниченные отражения
  • шероховатость влияет на рассеивание света

HDR позволяет корректно отображать:

  • солнечные блики на металле
  • отражения неба в воде
  • засветки от источников света

Пример загрузки PBR-объекта:

const viewer = new Cesium.Viewer("cesiumContainer");

viewer.scene.highDynamicRange = true;

const model = viewer.scene.primitives.add(
  Cesium.Model.fromGltf({
    url: "model.glb",
    scale: 1.0
  })
);

HDR и атмосфера Cesium

Система атмосферы в CesiumJS является физически основанной и напрямую зависит от HDR-рендеринга.

При включённом HDR корректно отображаются:

  • градиенты неба при закате и рассвете
  • интенсивность солнечного диска
  • рассеяние Рэлея и Ми

HDR позволяет не «обрезать» яркость солнца, а сохранять её физическую интенсивность внутри сцены.


Связь HDR и постобработки

HDR является фундаментом для всех постэффектов:

  • bloom (свечение ярких объектов)
  • glare (ореолы вокруг источников света)
  • tone mapping adjustment

Bloom особенно зависит от HDR, так как работает только с яркостями выше определённого порога.

Пример включения постэффекта:

viewer.scene.postProcessStages.bloom.enabled = true;
viewer.scene.postProcessStages.bloom.contrast = 125;
viewer.scene.postProcessStages.bloom.brightness = -0.2;
viewer.scene.postProcessStages.bloom.glowOnly = false;

Без HDR bloom теряет физический смысл, так как отсутствуют значения выше 1.0.


HDR и 3D Tiles

При работе с 3D Tiles HDR влияет на отображение больших городских сцен и геопространственных данных.

Особенности:

  • здания получают корректные световые градиенты
  • стеклянные поверхности отражают небо
  • переходы света между объектами становятся мягче
const tileset = viewer.scene.primitives.add(
  new Cesium.Cesium3DTileset({
    url: "tileset.json"
  })
);

viewer.scene.highDynamicRange = true;
viewer.zoomTo(tileset);

Управление яркостью сцены

HDR увеличивает динамический диапазон, но итоговая визуальная «экспозиция» регулируется камерой и настройками сцены.

Ключевые параметры:

Экспозиция камеры

viewer.scene.camera.exposure = 1.0;
  • уменьшение экспозиции затемняет сцену
  • увеличение усиливает яркость

Гамма-коррекция

viewer.scene.gamma = 2.2;

Гамма влияет на восприятие средних тонов и используется после tone mapping.


HDR и отражения

Отражения в CesiumJS строятся на environment mapping и используют HDR-данные для корректной интенсивности.

Типичные эффекты:

  • реалистичные отражения солнца на воде
  • блеск металлических поверхностей
  • освещение стеклянных объектов

HDR environment maps содержат значения яркости, выходящие за пределы 1.0, что невозможно в LDR.


Производительность HDR-рендеринга

HDR увеличивает нагрузку на GPU из-за:

  • использования float framebuffer
  • дополнительных этапов tone mapping
  • постобработки

Оптимизация зависит от:

  • разрешения рендера
  • количества post-process stages
  • сложности сцены (3D Tiles, модели)

Типичный компромисс:

  • включён HDR → реализм выше, нагрузка выше
  • отключён HDR → производительность выше, визуальная точность ниже

Особенности реализации в WebGL

CesiumJS работает поверх WebGL, поэтому HDR реализуется через:

  • RGBA16F / RGBA32F текстуры
  • расширения OES_texture_float / EXT_color_buffer_float
  • framebuffer objects (FBO)

Пайплайн:

  1. рендер сцены в HDR framebuffer
  2. применение tone mapping shader
  3. вывод в default framebuffer

Типичные артефакты и их природа

При неправильной конфигурации HDR могут появляться:

  • пересвеченные области (отключён tone mapping)
  • слишком тёмная сцена (неверная экспозиция)
  • «плоские» материалы (HDR выключен при PBR)
  • некорректные блики (ошибки environment maps)

Связь HDR и освещения

Свет в CesiumJS основан на физической модели:

  • directional light (солнце)
  • ambient light (небо)
  • image-based lighting (IBL)

HDR усиливает точность всех компонентов, позволяя:

  • сохранять интенсивность солнца как физического источника
  • корректно смешивать освещение неба и прямого света
  • избегать клиппинга ярких источников

HDR в контексте глобальной сцены

CesiumJS ориентирован на глобальные 3D-сцены, где HDR особенно важен из-за:

  • больших расстояний и перепадов освещения
  • сочетания дневных и ночных областей
  • необходимости физически корректной визуализации атмосферы

HDR становится базовым режимом для сцен, где одновременно присутствуют:

  • города
  • вода
  • облака
  • солнечное освещение
  • отражающие поверхности