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

Tone mapping, color-grading и HDR (openGL / glsl)

Страницы: 1 2 37 8 Следующая »
#0
3:18, 26 июля 2018

Пришло время сделать хороший цветкор.
Сейчас просто привожу цвет в 0...1 через средний цвет сцены (hdr-рендер), и получается шляпа.

+ Показать

Хочется что-бы было сочно, смачно и круто.
С чего начать? Стремлюсь к цвет-кору из и nfs 15.
Хочется разобраться в вопросе досконально.  Эту статью видел.

#1
3:45, 26 июля 2018

vindast
> Эту статью видел.
А эту статью видел?
> С чего начать?
Начать однозначно с Reinhard, потом уже можно баловаться с экспозицией.

#2
3:47, 26 июля 2018

vindast
> Сейчас просто привожу цвет в 0...1 через средний цвет сцены (hdr-рендер), и получается шляпа.
Судя по скриншоту шляпа получается прежде всего потому, что ты не учитываешь, что на экране должна быть sRGB картинка.

#3
3:52, 26 июля 2018

MrShoor
> А эту статью видел?
Видел. Сейчас такая формула.

vec3 getHDR(vec3 color)
{
  vec3 L = (hdrCompressionKoef / averageColor) * color;

  return  color * L / (vec3(1) + L);
}

averageColor - средний цвет текстуры.
hdrCompressionKoef - константа, у меня 0.17
MrShoor
> Судя по скриншоту шляпа получается прежде всего потому, что ты не учитываешь,
> что на экране должна быть sRGB картинка.
Учтено при освещении сцены (albedo = pow(albedo, vec3(2.2));)

#4
3:53, 26 июля 2018

Само освещение считается в RGB16F

#5
3:59, 26 июля 2018

vindast
> Учтено при освещении сцены (albedo = pow(albedo, vec3(2.2));)
Это ты при чтении из текстуры и освещении учитываешь. albedo у тебя линейный становится. Но на экран выводится не линейное изображение. На экране пиксель, который в 2 раза тускнее чем 255 будет не 127, а будет он 187.
Поэтому при финальном выводе в LDR текстуру надо хотя бы делать gl_FragColor = pow(hdr_color, 1.0/2.2);

А лучше вообще убрать всякие pow, и просто задать в формат альбед текстур SRGB цвет, и фреймбуфер задавать SRGB.

#6
4:00, 26 июля 2018

Был еще такой подход:

vec3 getHDR(vec3 color)
{
  vec3 L = (hdrCompressionKoef / dot(averageColor, vec3(0.299, 0.587, 0.114))) * color;

  return  L / (vec3(1) + L);
}

Но получается как-то блекло.

#7
4:03, 26 июля 2018

MrShoor
> Поэтому при финальном выводе в LDR текстуру
vindast
> Само освещение считается в RGB16F
Вывод шейдера освещения в RGB16F

#8
4:06, 26 июля 2018

Или я что то не то думаю?

#9
4:09, 26 июля 2018

vindast
> Вывод шейдера освещения в RGB16F
Да я не про вывод шейдера освещения, а про вывод после тонмаппинга. Тонмаппинг мапит hdr пространство на линейное ldr [0;1], и это линейное надо перевести в sRGB.

#10
4:11, 26 июля 2018

MrShoor У меня тонмап сейчас прямо на экран выводит...

#11
4:14, 26 июля 2018

vindast
> У меня тонмап сейчас прямо на экран выводит...
а экран sRGB, о чем я и говорю.
Ты понимаешь что такое sRGB ?

#12
4:18, 26 июля 2018

MrShoor
> sRGB
Знаю про такое пространство цвета. Я даже когда-то давно специально делал под pbr шейдер srgb буфер.
Если убрать hdr и сравнить с тем что показывает субстанс-пейнтер в pbr шейдере то один в один.
Я думаю что все нормально. Это просто сжатие в 0...1 кривое.

#13
4:32, 26 июля 2018

vindast
Тогда мне сложно что либо посоветовать. Оба тонмаппинга, которые ты привел - я таких не видел, и не знаю это твой велосипед или нет. Обычно мне хватает Reinhard или Filmic curve. Вот буквально как тут:
http://filmicworlds.com/blog/why-a-filmic-curve-saturates-your-blacks/

#14
4:37, 26 июля 2018

MrShoor
> велосипед
Мой. Я как раз хочу сделать все как у людей.

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

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

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