ArchiDevil
Мне кажется что для удовлетворительного результата можно просто подкрутить спекуляр.
nes
> Мне кажется что для удовлетворительного результата можно просто подкрутить
> спекуляр.
war_zes у тебя шо там, элт монитор?
Я сам не в понятии что за sRGB... то ли Gamma 2.2, то ли какая-то сложная формула. Проблема встала не так давно когда в моем ray tracing пришла пора прикручивать HDR (но спрашивается зачем там нужен HDR, если в данной техники такого понятия в помине не существует).
Плюсую насчёт понятности объяснения, на редкость хорошо объяснили, просто божественно.
ТС просто читай http://www.gamedev.ru/code/forum/?id=231785#m11 до просветления, не ну серьёзно, там всё что тебе нужно в плане принципиального понимания зачем.
Почитал тему, решил озадачится вопросом.
и так, если я правильно понял, то...
1 - грузим текстуры как GL_SRGB8 или GL_SRGB8_ALPHA8, за исключением карт нормалей. Альфа канал, судя по спекам остается линейным, верно? У меня там хранятся спекулары-высоты.
2 - врубаем GL_FRAMEBUFFER_SRGB
3 - рисуем кадр и пост процесс в сргб
4 - переводим в финальном проходе постпроцесса картинку обратно в линейное пространство.
barnes
4 не надо делать. Если ты поставил фреймбуфер в SRGB и все нужные текстуры у тебя созданы с форматом SRGB то тебе вообще ничего делать не нужно. Выборка в шейдерах сама за тебя все сконвертнет при чтении, а при записи ROP-ы все как надо запишут.
то есть от финального
fragData.rgb = pow(color, vec3(u_control.w)); // u_control.w = 1 / gamma
можно отказаться?
barnes
> то есть от финального
> fragData.rgb = pow(color, vec3(u_control.w)); // u_control.w = 1 / gamma
при желании вообще всю гамма-коррекцию можно руками делать. и при чтении из srgb текстуры можно руками возводить pow(val, 2.2f), и при записи можно делать pow(val, 1.0f / 2.2f). но это считается не тру, потому что теоретически srgb->linear преобразование в общем случае может быть сложнее и поэтому считается тру, чтобы вообще все srgb преобразования выполнялись автоматически и как именно они выполняются, тебя вообще волновать не должно.
один из самых простых способов проверить, что всё работает правильно — это взять текстуру какого-нибудь заранее известного цвета между (0.0f, 0.0f, 0.0f) и (1.0f, 1.0f, 1.0f). я, например, использу текстуру цвета (1.0f, 0.5f, 0.0f), потому что хорошо помню, как она должна выглядеть. и просто вывести её на экран с srgb-чтением из текстуры и srgb-записью в рендертаргет. если всё сделано правильно, те результирующая картинка должна быть точно такой же, как исходная текстура, то есть (1.0f, 0.5f, 0.0f), что можно проверить, сделав скриншот и пипетнув в пейнте.
barnes
> 1 - грузим текстуры как GL_SRGB8 или GL_SRGB8_ALPHA8, за исключением карт
> нормалей. Альфа канал, судя по спекам остается линейным, верно? У меня там
> хранятся спекулары-высоты.
в общем случае все текстуры и рендертаргеты, которые хранят в том или ином виде цвет, должны быть srgb. то есть цвет диффуза, спекьюлар, лайтмапы и тому подобное. все текстуры, которые хранят не цвет, должны быть линейными: прозрачность, высоту, нормали, lookup, смещения, глубина итп.
сразу скажу, что проблемы бывают с gbuffer'ом на d3d9, потому что в d3d9 srgb write — это рендрестейт сразу для всех рендертаргетов. поэтому если один таргет albedo, а второй — normals, то можно либо в оба писать srgb, либо в оба не писать. установить srgb для одного и linear для второго можно только в d3d11+. это — один из немногих случаев, когда srgb преобразование можно выполнить руками.
Кстати. Интересен тот факт, что в Quake 2 всё невероятно тёмное и надо иметь сверхяркий монитор, а Quake 3 при старте гамму экрана в винде выдрючивает так, что все окошки и прочее засвечивает люто. Вон я недавно процесс опенарены убил, так перезагрузиться пришлось, в десятке половина кнопок в диалогах была не видна, а тёмно-синие стали блёкло-голубенькими.
Можно ли сказать, что третья квака использует костыльный аналог sRGB, насилуя кривые яркости в видяхе?
Ещё мыслЯ: можно ли получить нищебродское HDR на 8 битах, если пожертвовать половиной диапазона? Ведь лимит яркости от этой половинки повысится в 4 раза, чего может хватить для всяких не особо честных отражений.
Cheb
> Можно ли сказать, что третья квака использует костыльный аналог sRGB, насилуя
> кривые яркости в видяхе?
Да, именно это она и делает. sRGB для бедных, когда еще львиная доля железа не поддерживала sRGB, а шейдеров не было. Выкручивались как могли. Так делает не только квака насколько мне известно, а еще например halflife первый.
Cheb
> можно ли получить нищебродское HDR на 8 битах, если пожертвовать половиной
> диапазона? Ведь лимит яркости от этой половинки повысится в 4 раза, чего может
> хватить для всяких не особо честных отражений.
нищебродское hdr можно получить несколькими способами. например, можно вместо цвета просто хранить в текстурах величину в духе color / 10 и обратно переводить её (color / 10) * 10 при чтении. разумеется, точность будет в 10 раз меньше, но диапазон будет в 10 раз больше. ещё можно R32G32B32_FLOAT текстуру примерно аппроксимировать, затолкав несколько экспонент в R8G8B8 текстуру одну за другой. то есть вместо одного RGB32 изображения солнышка, можно в одну текстуру затолкать, например, 4 RGB8 изображения солнышка с разными экспонентами, а потом из них в шейдере восстановить float-значение, сложив их по формуле в духе color1 * 1000 + color2 * 100 + color3 * 10 + color4. звучит костыльно, но я так делал для одного проекта, в котором нельзя было просто поменять формат текстуры, работало прекрасно.
Cheb
> Кстати. Интересен тот факт, что в Quake 2 всё невероятно тёмное и надо иметь
> сверхяркий монитор, а Quake 3 при старте гамму экрана в винде выдрючивает так,
> что все окошки и прочее засвечивает люто.
В ку2 гамма менялась коррекцией текстур на старте. Ку3 же использовал виндовый гамма рамп. И у него еще была такая бяка, если игра крашилась, то на десктопе оставалась выкрученная игрой гамма, что выбешивало просто безумно.
Вообще у меня как щас реализовано - читаю текстуры как ргб-ргба, все рисую а потом прохожу поверх пасом оутКолор = пов(колор, 1.0 / гамма), не считая коррекции по брайтнес-контраст-сатюрейшен если необходимо.
Никто не хочет написать термин для сайта про sRGB?