Пришло время сделать хороший цветкор.
Сейчас просто привожу цвет в 0...1 через средний цвет сцены (hdr-рендер), и получается шляпа.
Хочется что-бы было сочно, смачно и круто.
С чего начать? Стремлюсь к цвет-кору из и nfs 15.
Хочется разобраться в вопросе досконально. Эту статью видел.
vindast
> Эту статью видел.
А эту статью видел?
> С чего начать?
Начать однозначно с Reinhard, потом уже можно баловаться с экспозицией.
vindast
> Сейчас просто привожу цвет в 0...1 через средний цвет сцены (hdr-рендер), и получается шляпа.
Судя по скриншоту шляпа получается прежде всего потому, что ты не учитываешь, что на экране должна быть sRGB картинка.
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));)
Само освещение считается в RGB16F
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.
Был еще такой подход:
vec3 getHDR(vec3 color) { vec3 L = ( hdrCompressionKoef / dot( averageColor, vec3( 0.299, 0.587, 0.114))) * color; return L / ( vec3( 1) + L); }
Но получается как-то блекло.
MrShoor
> Поэтому при финальном выводе в LDR текстуру
vindast
> Само освещение считается в RGB16F
Вывод шейдера освещения в RGB16F
Или я что то не то думаю?
vindast
> Вывод шейдера освещения в RGB16F
Да я не про вывод шейдера освещения, а про вывод после тонмаппинга. Тонмаппинг мапит hdr пространство на линейное ldr [0;1], и это линейное надо перевести в sRGB.
MrShoor У меня тонмап сейчас прямо на экран выводит...
vindast
> У меня тонмап сейчас прямо на экран выводит...
а экран sRGB, о чем я и говорю.
Ты понимаешь что такое sRGB ?
MrShoor
> sRGB
Знаю про такое пространство цвета. Я даже когда-то давно специально делал под pbr шейдер srgb буфер.
Если убрать hdr и сравнить с тем что показывает субстанс-пейнтер в pbr шейдере то один в один.
Я думаю что все нормально. Это просто сжатие в 0...1 кривое.
vindast
Тогда мне сложно что либо посоветовать. Оба тонмаппинга, которые ты привел - я таких не видел, и не знаю это твой велосипед или нет. Обычно мне хватает Reinhard или Filmic curve. Вот буквально как тут:
http://filmicworlds.com/blog/why-a-filmic-curve-saturates-your-blacks/
MrShoor
> велосипед
Мой. Я как раз хочу сделать все как у людей.
Тема в архиве.
Тема закрыта.