Визуализация HDR (расширенный динамический диапазон) в Unity
При стандартной визуализации, красная, зеленая и синяя компоненты пикселя представлены дробным числом в диапазоне 0..1, где 0 указывает на нулевую интенсивность, а единица представляет максимальную интенсивность на дисплее. Хотя это просто в использовании, оно не отражает того, как освещение работает в сцене из реальной жизни. Человеческий глаз, как правило, приспосабливается к условиям освещения, так что объект, который выглядит белым в тускло освещенной комнате, в действительности может быть менее ярким, чем серый объект при дневном освещении. Кроме того, глаз более чувствителен к различиям яркости на нижнем краю диапазона, чем на верхнем.
Можно получить более убедительные визуальные эффекты, если рендеринг адаптирован так, чтобы диапазоны значений пикселей более точно отражали уровни освещения, которые могли бы присутствовать в реальной сцене. Хоть эти значения и будут очень нуждаться в обратной привязке к диапазону, доступному на устройстве отображения, любые промежуточные расчёты (такие, как эффекты пост-обработки Unity) дадут более реалистичные результаты. Возможность внутреннего представления графики использовать значения вне диапазона 0..1 является сущностью High Dynamic Range (HDR) рендеринга.
Работа с HDR
HDR включается для каждой камеры отдельно при при помощи свойств компонента Camera:-
Когда HDR активен, сцена отрисовывается в буфер изображения HDR, который может размещать значения пикселей вне диапазона 0..1. Затем этот буфер подвергается пост-обработке с помощью эффектов пост-обработки, таких как HDR bloom. Эффект пост-обработки tonemapping конвертирует HDR изображение в стандартное low dynamic range (LDR) изображение для отправки на экран. Преобразование в LDR должно происходить в какой-то момент процесса работы эффекта пост-обработки, но оно не должно происходить на последнем этапе, если после этого должны быть применены использующие только LDR эффекты пост обработки. Для удобства, некоторые эффекты пост-обработки могут автоматически конвертироваться в LDR после применения HDR эффекта (см. раздел Скриптинг, представленный ниже).
Tonemapping - это процесс упаковывания HDR значений обратно в LDR диапазон. Существует множество различных методов, и то, что хорошо для одного проекта, может не быть лучшим выбором для другого. В Unity включён набор разных tonemapping эффектов пост-обработки. Для того, чтобы их использовать, выберите Assets -> Import Package -> Image Effects (Pro Only), затем выберите камеру в сцене и выберите Component -> Image Effects ->ToneMapping. Подробное описание tonemapping типов можно найти в документации по эффектам пост-обработки.
Использование HDR позволяет получить намного больше контроля в пост-обработке. У LDR блума (bloom) есть неудачный побочный эффект размытия многих областей экрана, даже если интенсивность их пикселей менее 1.0. С помощью HDR можно применять блум только к тем областям, где интенсивность выше единицы. Это приводит к более желанному результату, когда по соседним пикселям “растекаются” только очень яркие элементы сцены. Встроенный эффект пост-обработки ‘Bloom and Lens Flares’ теперь тоже поддерживает HDR. Чтобы добавить его к камере, выберите Assets -> Import Package -> Image Effects (Pro Only), затем выберите камеру в сцене, и выберите Component -> Image Effects ->Bloom. Более подробное описание эффекта ‘Bloom’ можно найти в документации по эффектам пост-обработки.
Преимущества HDR
Недостатки HDR
Заметки по использованию
В режиме упреждающего рендеринга, HDR поддерживается только если у вас присутствует эффект пост-обработки. Это связано с вопросами производительности. Если у вас не присутствует эффект пост-обработки, тогда не будет существовать tone mapping и будет происходить отсечение интенсивности. В такой ситуации сцена будет отрисована прямо в бэкбуфер, в котором не поддерживается HDR.
В режиме HDR память под буфер light prepass buffer будет также выделяться как под буфер с плавающей запятой. Это снижает связанность в буфере освещения. HDR поддерживается при отложенном рендеринге, даже если не используются эффекты пост-обработки.
К скрипту с эффектом пост-обработки можно добавить атрибут ImageEffectTransformsToLDR для указания того, что целевой буфер должен быть в LDR, а не в HDR. По сути, это значит, что скрипт может автоматически конвертировать в LDR после применения своего HDR эффекта пост-обработки.