Я пытаюсь понять, что такое HDR и как он работает.
Я понимаю основные понятия и имею небольшое представление о том, как это реализовано с помощью D3D / hlsl.
Однако все еще довольно туманно.
Скажем, я отрисовываю сферу с текстурой земли и небольшим списком вершин, чтобы выступать в качестве звезд, как бы я отобразил это в HDR?
Вот несколько вещей, которые меня смущают:
Я предполагаю, что я не могу использовать какой-либо базовый формат изображения для текстуры, так как значения будут ограничены [0, 255] и ограничены [0, 1] в шейдере. То же самое касается заднего буфера, я так понимаю, формат должен быть форматом с плавающей запятой?
Какие есть другие шаги? Конечно, должно быть нечто большее, чем просто использование форматов с плавающей запятой для рендеринга к цели рендеринга, а затем применения некоторого цветения в качестве пост-процесса? (учитывая, что выход будет 8bpp в любом случае)
В основном, каковы шаги для HDR? Как это работает ? Кажется, я не могу найти хороших статей / статей, описывающих этот процесс, кроме этого , но кажется, что он немного скользит по основам, так что это сбивает с толку.
Технически, HDR просто означает использование большего диапазона возможных значений для вашей графики. Обычно вы ограничены 256 дискретными значениями для красного, зеленого и синего каналов, а это означает, что если у вас есть 2 элемента, один из которых в два раза ярче другого, а третий, который в 10000 раз ярче первого, то нет Таким образом, вы можете правильно представить все 3 в одной и той же сцене - вы либо делаете яркий объект только в 256 раз ярче первого вместо этого, либо вы делаете оба тусклых объекта полностью черными (теряя контраст между ними), а затем яркий объект становится бесконечно ярче чем они оба.
Это легко исправить, используя значения с плавающей запятой для значений красного / зеленого / синего, но теперь у вас есть проблема с отображением этого на графическом устройстве, которое обрабатывает только фиксированное количество дискретных значений на канал (например, 256) , Итак, вторая часть проблемы заключается в том, как отобразить значения с плавающей запятой обратно в ограниченный диапазон. Тривиальное решение состоит в том, чтобы пропорционально масштабировать все значения в дискретном диапазоне, но это будет означать, что 1 очень яркий пиксель может сделать остальную часть экрана черным и т. Д. Иногда это то, что вы хотите, иногда это не так - см. Тональное отображение CiscoIPPhone ссылка на примеры того, как вы можете подойти к этому.
Как правило, не ваши текстуры должны храниться в новом формате, а когда к ним применяется освещение, вы должны иметь возможность принимать большие значения. Очевидно, однако, если у вас есть источники света, запеченные в текстуру - например. звездный фон - вам может понадобиться формат с более высоким разрешением. Или просто сделайте так, чтобы шейдер масштабировал значения таких материалов, когда придет время их визуализировать.
источник
Компьютеры традиционно представляли каждый пиксель на экране как только 24 бита в памяти: 8 для красного, 8 для зеленого и 8 для синего. Этого почти достаточно, чтобы человек не заметил, если бы вы добавили больше, а 8-битный байт очень удобен для микропроцессоров, так что вот что застряло.
В то время как 8 битов почти достаточно для отображения изображения, определенно недостаточно для вычисления изображения. В различных точках при вычислении изображения требуется точность не менее 32 бит.
Вот почему пиксельные шейдеры вычисляют цвета с 32-битной точностью, даже когда вы визуализируете изображение с 8-битной точностью. В противном случае вы не сможете, например, разделить значение на 1000, а затем умножить его на 1000, потому что деление любого 8-битного значения на 1000 приводит к нулю.
В трехмерной графике в реальном времени наблюдается тенденция к сохранению всей графики с> 8-битной точностью до последнего возможного момента, когда> 8 битов красного цвета понижают до 8 битов и т. Д. Для зеленого и синего цветов.
HDR относится к процессу рендеринга изображений с точностью выше 8 бит. В современных телевизионных видеоиграх 16-битная точность является нормой, и этого может быть «достаточно» в видеоиграх на долгие годы.
источник
Одним из аспектов, который я считаю ключевым для HDR, является правильное применение гаммы монитора.
Монитор, на который вы смотрите, излучает свет как функцию входных пикселей. Можно ожидать, что пиксель со значением 255 будет давать (приблизительно) в 255 раз больше света, чем пиксель со значением 1. Это не так. При стандартной гамме монитора 2,3 она становится в 255 ^ 2,3 раза ярче, или примерно 340000!
Все, кто производит контент (производители камер), знают это, или (если вы дизайнер) вы неявно компенсируете это.
Это нормально, если вы просто визуализируете растровые изображения (ну, в большинстве случаев), но если вы используете их в качестве текстур в 3D-сцене, это уже другая история. Если вы хотите правильно смоделировать взаимодействие со светом, вы должны использовать линейные расчеты освещения по всему конвейеру рендеринга. Это означает
исправляя ваши текстуры для гаммы
рендеринг всего с линейным светом (где вам нужна большая точность из-за большого динамического диапазона света),
примените обратное гамма-преобразование монитора как последнее, прежде чем поместить изображение на экран.
Когда вы вносите это изменение в существующую сцену с существующими изображениями, источниками света и т. Д., Вам, вероятно, придется исправлять большую часть интенсивности света и текстур, потому что они были выбраны так, чтобы хорошо выглядеть при рендеринге с нелинейным освещением. Так что это не та особенность, которую вы можете просто «включить» и ожидать, что все будет выглядеть лучше именно так.
источник