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

sRGB - для чего?

Страницы: 1 2 311 12 Следующая »
#0
7:48, 28 ноя. 2017

Раньше таким не заморачивался... Но вообще везде и всюду советуют. Попробовал

glEnable(GL_FRAMEBUFFER_SRGB);
glClearColor(0.09f, 0.09f, 0.09f, 1.0f);

Изображение


WAT???

Цвет же не соответствует заданному.
Читал что это нужно для гамма корекции - но так ли на самом деле? Вместо темно серового получать мыльно-белый - что-то мне не нравится такое


#1
8:19, 28 ноя. 2017

добро пожаловать в увлекательный мир программирования.
Изображение
хочется тебе того или нет, но чередующиеся линии цветов (0, 0, 0) и (1, 1, 1) визуально вовсе не дают цвет (0.5, 0.5, 0.5). они дают цвет приблизительно (0.5, 0.5, 0.5)^(1/2.2). именно поэтому на рисунке выше при правильной калибровке монитора полосатый бэграунд должен слиться с квадратом 2.2 цвета (186, 186, 186) / 255, а не с квадратом 1.0 цвета (128, 128, 128) / 255, с которым бы он слился, если бы восприятие цвета было линейным. отсюда уже всё остальное, включая блендинги, вычисления в линейном пространстве итп.

#2
8:47, 28 ноя. 2017

Suslik
> 128) / 255, с которым бы он слился, если бы восприятие цвета было линейным.
что с чем тут должно слиться? у меня ничего ни с чем не сливается (визуально)


Попробовал свою демку
Изображение
ярко. я не такой цвет задумывал. и появляется мыло так как больше цветов сливаются в белый

#3
9:10, 28 ноя. 2017

war_zes
> ярко. я не такой цвет задумывал

А ты обратно из линейного пространства в sRGB переводишь?

#4
9:13, 28 ноя. 2017

0xc0de
> А ты обратно из линейного пространства в sRGB переводишь?
???

#5
9:15, 28 ноя. 2017

war_zes

Освещение и блендинг нужно делать в линейном пространстве, поэтому текстуры переводятся sRGB->RGB, финальное изображение нужно наоборот приводить к sRGB

#6
9:15, 28 ноя. 2017

0xc0de
> А ты обратно из линейного пространства в sRGB переводишь?
А можно где-то вообще посмотреть пример кода работы с этой трихомонадой? Глянул этот пост и самому стало интересно :) как-то ещё не задумывался об sRGB.

#7
9:18, 28 ноя. 2017

Daniil Petrov
> А можно где-то вообще посмотреть пример кода работы с этой трихомонадой

Конечно! В интернете полно инфы на эту тему и примеры есть. Мне просто лень за тебя искать в гугле :)

#8
9:20, 28 ноя. 2017

0xc0de
> Освещение и блендинг нужно делать в линейном пространстве, поэтому текстуры
> переводятся sRGB->RGB, финальное изображение нужно наоборот приводить к sRGB
хум... Я всего лишь  вставил glEnable(GL_FRAMEBUFFER_SRGB);

Я так понимаю что текстуры у меня в линейном пространстве

#9
9:21, 28 ноя. 2017

war_zes
> хум... Я всего лишь  вставил glEnable(GL_FRAMEBUFFER_SRGB);
> Я так понимаю что текстуры у меня в линейном пространстве

Ты картинку фреймбуфера приводишь к sRGB, а оно у тебя итак в sRGB, т.к. текстуры похоже не переводил в RGB.

#10
9:23, 28 ноя. 2017

war_zes

Чтобы текстуры были в sRGB нужно при создании указывать соответствующий формат текстуры. Или в шейдере вручную конвертить.

#11
9:25, 28 ноя. 2017

war_zes
Представь для начала себе 1 свечу, стоящую далеко от тебя. Ты видишь её яркость. Потом к этой свече добавляют еще +1 свечу. Ты видишь, что стало реально ярче. Теперь возьмем другой сценарий. Далеко от тебя стоит 1000 свечей (они далеко, и для тебя они сливаются в одну точку). Потом к этой 1000 свечей добавляют еще +1. Вот ты нифига не заметишь разницы.
Теперь воьзмем картинку. В ней 8 бит на канал, а значит яркость распределена на интервале [0;255]. Если бы все было по честному, и каждая единица в этом интервале была равна скажем как в примере одной свече, то разница между 254 и 255 была бы совершенно незаметна, а разница между 0 и 1 просто охренеть как заметна. Чтобы схитрить и сэкономить битики умные дядьки решили. А давайте растянем диапазон в районе нуля, а в районе 255 наоборот сузим. В действительности они еще учли разную чувствительность разных колобочек в глазу и т.п. и вышел sRGB, который все мониторы и показывают.
Но теперь появилась проблемс. Ты не можешь взять цвет (32,32,32) и порсто прибавить к нему скажем (32,32,32), потому что итоговая яркость (64,64,64) будет не в 2 раза выше. Ведь теперь 1 яркости != одной свече. Поэтому чтобы сложить два света тебе надо перевести их в линейное пространство (где каждая добавленная единица будет давать верный +1 в яркость), сложить, а потом обратно перевести в sRGB. Такие дела.

#12
9:37, 28 ноя. 2017

0xc0de
> Чтобы текстуры были в sRGB нужно при создании указывать соответствующий формат
> текстуры. Или в шейдере вручную конвертить.
окей, но первый вопрос был про glClearColor

Я написал glClearColor(0.00f, 0.5f, 1.0f, 1.0f);
то есть цвет [0,127,255];

Теперь я включаю glEnable(GL_FRAMEBUFFER_SRGB)
Делаю скришот, вставляю этот скриншот в паинт, пипеткой смотрю цвет.... и да, цвет другой
[0,187,255]


и зачем это надо? Тут вопрос именно в том - зачем вся эта возьня нужна?

#13
9:39, 28 ноя. 2017

war_zes
> Я написал glClearColor(0.00f, 0.5f, 1.0f, 1.0f);
> то есть цвет [0,127,255];
> Теперь я включаю glEnable(GL_FRAMEBUFFER_SRGB)
> Делаю скришот, вставляю этот скриншот в паинт, пипеткой смотрю цвет.... и да,
> цвет другой
> [0,187,255]

Все верно. В ClearColor линейный цвет, а из фреймбуфера получаем sRGB.

> и зачем это надо? Тут вопрос именно в том - зачем вся эта возьня нужна?

Для корректного блендинга и расчета освещения.

#14
9:40, 28 ноя. 2017

Ну и суслик выше картинку привел. Суть картинки такова. Если нанести однопиксельных полос на экран черных (0;0;0) и белых (255;255;255) то издалека они будут сливаться в один цвет. Так как черных и белых полос поровну, то сливаться они будут в цвет в 2 раза менее яркий. Математически это выходит 255/2 ~127. Но если мы возьмем цвет 127, то он окажется наааамного темнее, так как черный диапазон у нас как мы помним растянут. 127 на его картинке там, где написано 1.0. Но полосы будут похожи на тот цвет, где написано 2.2, а там цвет аж (186,186,186). Как ты понимаешь 255/2 сильно далеко от этого цвета. Поэтому просто брать и считать цвет в шейдере нельзя, нужно обязательно переводить его в линейное пространство.

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