ПрограммированиеФорумГрафика

Tone mapping, color-grading и HDR (openGL / glsl) (3 стр)

Страницы: 1 2 3 4 58 Следующая »
#30
22:56, 26 июля 2018

vindast
> return color * (hdrCompressionKoef / averageColor) / (1.0 / (1.0 + L));
Что то странное... двойное деление?
Упрощается до:

return color * (hdrCompressionKoef / averageColor) * (1.0 + L);

Если учесть, что hdrCompressionKoef / averageColor это exposure, то выходит вот это:

color * exposure + color * rgb2luma(color) *  exposure

Прости, но это хрень какая-то :)

#31
23:02, 26 июля 2018

MrShoor, я особо не думал, по сути скопипастил формулу с той статьи.
Тоже хотел это деление выполнить на cpu, а в шейдер уже готовое число отправить.

#32
20:01, 30 июля 2018

Лучше всего сразу реализовать ACES Tone Mapping, цвета с ним получаются более естественными и насыщенными.
По ссылке выше я выкладывал код на hlsl, но была проблема с конвертацией его на glsl, может быть, у тебя получится.

vindast
> Хочется сделать цветкор как у nfs 2015. Там очень сочный ночной цвет.
Очень вероятно, что он как раз и используется в Need for Speed. Также данная техника тонирования используется в Star Citizen, там тоже "очень сочный ночной цвет":

+ Показать

После добавления ACES Tone Mapping можно будет реализовать цветокоррекцию. С ее помощью можно будет изменить Saturation, Contrast, Gamma, Gain и Offset для всей сцены целиком или независимо для теней, полутеней и ярких участков.

Если нужен будет полный код шейдеров — скину.

#33
20:05, 30 июля 2018

>ACES Tone Mapping
ацес погано выглядит, лучше смотри в сторону Gran Turismo tonemapper

#34
20:38, 30 июля 2018

Battle Angel Alita
> Gran Turismo tonemapper
Этот? https://www.shadertoy.com/view/Xstyzn

#35
20:51, 30 июля 2018

ENAleksey, в приведенных тобой шейдерах в той теме экспозиция не учитывается.  Либо я что-то жестко не понимаю. + завал в фиолетовый цвет.

#36
21:29, 30 июля 2018

Не хочу никого обидеть, но что первый, что второй вариант выглядят хуже чем тот что у меня есть.

#37
0:00, 31 июля 2018

vindast
> ENAleksey, в приведенных тобой шейдерах в той теме экспозиция не учитывается.
> Либо я что-то жестко не понимаю.
Экспозиция, в каком-то смысле, - это коэффициент усиления между силой света в объективе и показанием, считываемым с элемента матрицы электроникой.
Сила света определяется окружением и не зависит от состояния камеры. Допустим, у нас на пиксель приходит постоянный свет силой в 1 канделу.
Светоматрица работает таким образом, что каждый фотон, который прилетает в ячейку, ловится этой ячейкой и там и остаётся в виде небольшого заряда.
Процесс съёмки выглядит так. Сначала на матрицу подаётся специальный сигнал, который очищает все ячейки от накопленного заряда. Затем, в течение определённого времени - например, 10 миллисекунд - на матрицу фокусируется свет с объектива. В течение всего этого времени, каждая ячейка собирает падающие на неё фотоны. Разумеется, чем ярче свет, падающий на определённую ячейку, тем больший заряд она накопит за то же время. В целом - если на пиксель приходит свет интенсивностью I, то за время t в ячейке накопится заряд Q = I t.
По окончанию этого периода, электроника быстро считывает количество заряда, накопленного на каждой ячейке, и сохраняет эту информацию. Если происходит видеосъёмка - то вскоре после считывания ячейки снова разряжаются и процесс начинается по-новой.
В реальных ситуациях, разница в силе света между светлыми и тёмными участками может достигать сотен тысяч раз; однако, значительная часть остальной инфраструктуры - форматы изображений, экраны, принтеры - способна работать только с парой сотен дискретных уровней освещённости. Чтобы передать такой широкий сигнал через такие узкие системы, считанные с ячеек измерения подвергаются дополнительному уплотнению.
На первой стадии, для сужения динамического диапазона, сигнал пропускается через нелинейную функцию - по сути, тонмаппер. Цель этого преобразования - упаковать практически бесконечный диапазон реальных измерений [0; +inf) на ограниченный отрезок [0; 1]. Чтобы не терять различий между разными показаниями, применяется гладкая функция - например, при L = Q / (Q + 1) значения Q=2 и Q=3 отображаются не оба на L=1 (что получилось бы при тупом обрезании), а на L=0.67 и L=0.75 соответственно - что, например, позволит разглядеть рисунок на ярко освещённой белой стене.
Аналогичное сужение используется и в обработке звука. Энергия, передаваемая звуком огнестрельного выстрела, на несколько порядков превосходит энергию человеческой речи. Однако, чтобы уложить колебания в диапазон, допустимый для наушников, их громкости сводят ближе друг к другу.
На второй стадии, к суженному значению применяется гамма-кодирование. Человеческое зрение работает как бы по логарифмической шкале - чем больше света попадает в глаз, тем больше минимальное изменение этого света, которое человек заметит. Поэтому дискретные уровни расположены не равномерно по отрезку [0; 1], а особым образом, в чём-то похожим на кодирование float - малым величинам отдаётся больше дискретных уровней, что позволяет их передать более точно. В частности, на кодирование интервала [0; 0.5) отдаётся 187 уровней, тогда как на [0.5; 1] - только оставшиеся 68. Смысл формулы S = round(255 L1 / 2.2) - это соответствие между сжатыми величинами L и номерами уровней S.
Собственно, причина существования экспозиции - съёмки могут происходить в самых разных условиях. Например, камера может солнечным днём видеть всю сцену залитой светом с I=100 000кд; а затем та же камера ночью при свете уличных фонарей - вылавливать I=10кд. Задача регулирования экспозиции в том, чтобы максимально эффективно использовать узкий sRGB для передачи контрастов в каждой отдельно взятой сцене. Традиционный метод же - это регулирование времени экспозиции t, за счёт которого все сцены приводятся к примерно одному диапазону Q; а остальная система уже подгоняется под один универсальный диапазон и экспозицию больше не учитывает.
Отсюда и название - термином "exposure" называли именно интервал времени, в течение которого фотоплёнка выставлялась под действие света с объектива; а для реализации применялся специальный механизм в виде шторок, открывающий и закрывающих путь света между объективом и плёнкой и издававший при этом характерный звук.

#38
8:13, 31 июля 2018

Delfigamer, я имею в виду что там учитываются данные только этого фрагмента, а средний цвет сцены и тд нет.

#39
9:27, 31 июля 2018

vindast
> экспозиция не учитывается
А зачем её учитывать?

vindast
> завал в фиолетовый цвет
Это исправляется:

+ Показать
#40
9:33, 31 июля 2018

Можешь скинуть пару hdr скриншотов в линейном пространстве? Я протестирую насколько видов тонирования (твой, Reinhard, Hable, Hejl, Uncharted 2, ACES и Gran Turismo).

#41
9:51, 31 июля 2018

ENAleksey
> А зачем её учитывать?
Ну что бы был заметен перепад цвета между яркими областями и темными. Могу видос записать где хорошо будет видна работа экспозиции.

#42
9:52, 31 июля 2018

ENAleksey
> hdr скриншотов в линейном пространстве?
Для этого буфер придется как-то записать. А я, увы, сохранять в hdri не умею.

#43
9:52, 31 июля 2018

ENAleksey
> твой
Не мой) Я же ссылки кидал  тут в теме.

#44
10:55, 31 июля 2018

vindast
> Могу видос записать где хорошо будет видна работа экспозиции.
Давай, а то я не очень понимаю, как перепад цвета между яркими и темными областям может быть не заметен.

Страницы: 1 2 3 4 58 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.

Тема закрыта.