В классическом рендеринге изображения ограничены диапазоном 0–1, где значения яркости жёстко «обрезаются» при выходе за пределы. Такой подход упрощает вычисления, но приводит к потере деталей в ярких участках и отсутствию реалистичной адаптации освещения. HDR (High Dynamic Range) рендеринг решает эту проблему за счёт хранения и обработки значений яркости в расширенном диапазоне, превышающем стандартные ограничения.
В CesiumJS HDR используется как часть общей системы физически корректного рендеринга (PBR), влияя на отображение неба, освещения, отражений и материалов.
HDR в CesiumJS встроен в рендеринг сцены и тесно связан с несколькими подсистемами:
Ключевая идея: сцена сначала рендерится в HDR-буфер с плавающей точкой, после чего преобразуется в LDR-изображение для отображения на экране.
Основной переключатель HDR находится в объекте сцены:
const viewer = new Cesium.Viewer("cesiumContainer");
viewer.scene.highDynamicRange = true;
При включении:
Отключение возвращает классический LDR-пайплайн:
viewer.scene.highDynamicRange = false;
HDR-буфер содержит значения яркости, которые выходят за пределы дисплея. Чтобы визуализировать такие данные, применяется тональная компрессия.
В CesiumJS используется встроенный tone mapping, который:
Фактически pipeline выглядит так:
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
})
);
Система атмосферы в CesiumJS является физически основанной и напрямую зависит от HDR-рендеринга.
При включённом HDR корректно отображаются:
HDR позволяет не «обрезать» яркость солнца, а сохранять её физическую интенсивность внутри сцены.
HDR является фундаментом для всех постэффектов:
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.
При работе с 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.
Отражения в CesiumJS строятся на environment mapping и используют HDR-данные для корректной интенсивности.
Типичные эффекты:
HDR environment maps содержат значения яркости, выходящие за пределы 1.0, что невозможно в LDR.
HDR увеличивает нагрузку на GPU из-за:
Оптимизация зависит от:
Типичный компромисс:
CesiumJS работает поверх WebGL, поэтому HDR реализуется через:
Пайплайн:
При неправильной конфигурации HDR могут появляться:
Свет в CesiumJS основан на физической модели:
HDR усиливает точность всех компонентов, позволяя:
CesiumJS ориентирован на глобальные 3D-сцены, где HDR особенно важен из-за:
HDR становится базовым режимом для сцен, где одновременно присутствуют: