как работает HDR?

17

Я пытаюсь понять, что такое HDR и как он работает.

Я понимаю основные понятия и имею небольшое представление о том, как это реализовано с помощью D3D / hlsl.

Однако все еще довольно туманно.

Скажем, я отрисовываю сферу с текстурой земли и небольшим списком вершин, чтобы выступать в качестве звезд, как бы я отобразил это в HDR?

Вот несколько вещей, которые меня смущают:

  • Я предполагаю, что я не могу использовать какой-либо базовый формат изображения для текстуры, так как значения будут ограничены [0, 255] и ограничены [0, 1] в шейдере. То же самое касается заднего буфера, я так понимаю, формат должен быть форматом с плавающей запятой?

  • Какие есть другие шаги? Конечно, должно быть нечто большее, чем просто использование форматов с плавающей запятой для рендеринга к цели рендеринга, а затем применения некоторого цветения в качестве пост-процесса? (учитывая, что выход будет 8bpp в любом случае)

В основном, каковы шаги для HDR? Как это работает ? Кажется, я не могу найти хороших статей / статей, описывающих этот процесс, кроме этого , но кажется, что он немного скользит по основам, так что это сбивает с толку.

dotminic
источник

Ответы:

19

Методы HDR позволяют имитировать больший диапазон деталей, чем вы можете видеть на экране, чем при традиционном освещении / текстурах. Вы можете сравнить его с тем, как ведет себя глаз при воздействии различного количества света - когда слишком много света, глаз пропускает меньше света, поэтому вещи все еще находятся в вашем видимом диапазоне. Когда света недостаточно, радужная оболочка открывается больше, поэтому можно увидеть больше деталей.

bit-tech.net Сравнение HDR

Правая сторона этого изображения использует HDR. Это больше использует диапазон цветов, темные темнее и яркие области ярче. Для сравнения левая сторона изображения выглядит немного плоской.

Основные шаги:

  1. Выполните рендеринг вашей сцены в текстуру с плавающей точкой (в таком формате, как A16B16G16R16F), используя другие текстуры с плавающей точкой на ваших моделях и / или источники света, которые могут иметь яркость больше 1,0f.

  2. Чтобы отобразить эту текстуру, диапазон видимых цветов необходимо преобразовать во что-то, отображаемое на экране - этот процесс называется тональным отображением , и для получения различных эффектов можно использовать различные уравнения тонального отображения. Это необходимо, поскольку мониторы не могут отображать полный спектр цветов или свечения, которые мы можем хранить в текстурах с плавающей запятой (было бы здорово, если бы это было возможно, но это также было бы ослепляющим риском ...).

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

надеюсь, это поможет

CiscoIPPhone
источник
Я знаю, что это (очень) старый вопрос, но можете ли вы отослать меня к хорошему, но простому алгоритму тонального отображения?
JSQuareD
6

Технически, HDR просто означает использование большего диапазона возможных значений для вашей графики. Обычно вы ограничены 256 дискретными значениями для красного, зеленого и синего каналов, а это означает, что если у вас есть 2 элемента, один из которых в два раза ярче другого, а третий, который в 10000 раз ярче первого, то нет Таким образом, вы можете правильно представить все 3 в одной и той же сцене - вы либо делаете яркий объект только в 256 раз ярче первого вместо этого, либо вы делаете оба тусклых объекта полностью черными (теряя контраст между ними), а затем яркий объект становится бесконечно ярче чем они оба.

Это легко исправить, используя значения с плавающей запятой для значений красного / зеленого / синего, но теперь у вас есть проблема с отображением этого на графическом устройстве, которое обрабатывает только фиксированное количество дискретных значений на канал (например, 256) , Итак, вторая часть проблемы заключается в том, как отобразить значения с плавающей запятой обратно в ограниченный диапазон. Тривиальное решение состоит в том, чтобы пропорционально масштабировать все значения в дискретном диапазоне, но это будет означать, что 1 очень яркий пиксель может сделать остальную часть экрана черным и т. Д. Иногда это то, что вы хотите, иногда это не так - см. Тональное отображение CiscoIPPhone ссылка на примеры того, как вы можете подойти к этому.

Как правило, не ваши текстуры должны храниться в новом формате, а когда к ним применяется освещение, вы должны иметь возможность принимать большие значения. Очевидно, однако, если у вас есть источники света, запеченные в текстуру - например. звездный фон - вам может понадобиться формат с более высоким разрешением. Или просто сделайте так, чтобы шейдер масштабировал значения таких материалов, когда придет время их визуализировать.

Kylotan
источник
5

Компьютеры традиционно представляли каждый пиксель на экране как только 24 бита в памяти: 8 для красного, 8 для зеленого и 8 для синего. Этого почти достаточно, чтобы человек не заметил, если бы вы добавили больше, а 8-битный байт очень удобен для микропроцессоров, так что вот что застряло.

В то время как 8 битов почти достаточно для отображения изображения, определенно недостаточно для вычисления изображения. В различных точках при вычислении изображения требуется точность не менее 32 бит.

Вот почему пиксельные шейдеры вычисляют цвета с 32-битной точностью, даже когда вы визуализируете изображение с 8-битной точностью. В противном случае вы не сможете, например, разделить значение на 1000, а затем умножить его на 1000, потому что деление любого 8-битного значения на 1000 приводит к нулю.

В трехмерной графике в реальном времени наблюдается тенденция к сохранению всей графики с> 8-битной точностью до последнего возможного момента, когда> 8 битов красного цвета понижают до 8 битов и т. Д. Для зеленого и синего цветов.

HDR относится к процессу рендеринга изображений с точностью выше 8 бит. В современных телевизионных видеоиграх 16-битная точность является нормой, и этого может быть «достаточно» в видеоиграх на долгие годы.

bmcnett
источник
2

Одним из аспектов, который я считаю ключевым для HDR, является правильное применение гаммы монитора.

Монитор, на который вы смотрите, излучает свет как функцию входных пикселей. Можно ожидать, что пиксель со значением 255 будет давать (приблизительно) в 255 раз больше света, чем пиксель со значением 1. Это не так. При стандартной гамме монитора 2,3 она становится в 255 ^ 2,3 раза ярче, или примерно 340000!

Все, кто производит контент (производители камер), знают это, или (если вы дизайнер) вы неявно компенсируете это.

Это нормально, если вы просто визуализируете растровые изображения (ну, в большинстве случаев), но если вы используете их в качестве текстур в 3D-сцене, это уже другая история. Если вы хотите правильно смоделировать взаимодействие со светом, вы должны использовать линейные расчеты освещения по всему конвейеру рендеринга. Это означает

  • исправляя ваши текстуры для гаммы

  • рендеринг всего с линейным светом (где вам нужна большая точность из-за большого динамического диапазона света),

  • примените обратное гамма-преобразование монитора как последнее, прежде чем поместить изображение на экран.

Когда вы вносите это изменение в существующую сцену с существующими изображениями, источниками света и т. Д., Вам, вероятно, придется исправлять большую часть интенсивности света и текстур, потому что они были выбраны так, чтобы хорошо выглядеть при рендеринге с нелинейным освещением. Так что это не та особенность, которую вы можете просто «включить» и ожидать, что все будет выглядеть лучше именно так.

JDV-Ян де Ваан
источник
2
Гамма определенно важна и является ключом к правильному физическому рендерингу, но не имеет прямого отношения к HDR, IMO.
Натан Рид