Цветовое пространство. Что ж, про RGB знают все: три значения, нормированные в диапазоне [0.0,1.0], которые имеют значение интенсивности цветовых компонентов Красный Зеленый Синий; эта интенсивность подразумевается как линейная, не так ли?
Гамма. Насколько я понимаю, гамма - это функция, которая сопоставляет компоненты цвета RGB с другим значением. Погуглив по этому поводу, я видел линейные функции и нелинейные функции ... Линейные функции, кажется, масштабируют компоненты RGB, поэтому кажется, что они настраивают яркость изображения; нелинейные функции, кажется, «распаковывают» более темные / более светлые компоненты.
Теперь я начинаю реализовывать программу просмотра изображений, которая будет отображать различные форматы изображений в виде текстуры. Я хотел бы изменить гамму этих изображений, поэтому я должен создать фрагментный шейдер и запустить текстурированный четырехугольник. Хорошо, но как мне определить правильную гамма-коррекцию?
OpenGL работает с использованием линейного цветового пространства RGB и компонентов с плавающей запятой. Действительно, я мог вычислить значения с гамма-коррекцией, начиная с этих значений (со специальной точностью с плавающей запятой), чтобы они отображались после фиксации значения с гамма-коррекцией.
Сначала я определю гамма-рампу. Как я мог это определить? (аналитически или с использованием таблиц поиска)
Затем я подошел к вопросу о расширении OpenGL EXT_framebuffer_sRGB, которое кажется очень связанным с расширением EXT_texture_sRGB.
EXT_texture_sRGB представляет новый формат текстуры, который используется для линеаризации текстовых значений в линейное пространство RGB. (сноска 1) Таким образом, я знаю цветовое пространство sRGB и использую его как линейное цветовое пространство RGB.
Вместо этого расширение EXT_framebuffer_sRGB позволяет мне кодировать линейные значения RGB в фреймбуфер sRGB, не беспокоясь об этом.
...
Подождите, вся эта информация для чего? Если я могу использовать кадровый буфер sRGB и загружать текстуры sRGB, обрабатывать эти текстуры без преобразования sRGB ... зачем мне корректировать гамму?
Может все-таки гамму подправить хоть на sRGB буфере? Или мне лучше нет? А яркость и контраст: до или после гамма-коррекции?
Это много информации, я сейчас запутался. Надеюсь, что кто-то из вас сможет подробнее объяснить мне все эти концепции! Спасибо.
...
Есть еще вопрос. Если гамма устройства отличается от "стандартной" 2.2, как мне "накапливать" разные гамма-коррекции? Я не знаю, ясно ли: в случае, если значения RGB изображения уже скорректированы для монитора со значением гаммы 2,2, но монитор имеет значение гаммы 2,8, как мне исправить гамму?
(1) Вот отрывок, чтобы подчеркнуть, что я имею в виду:
Цветовое пространство sRGB основано на типичных (нелинейных) характеристиках монитора, ожидаемых в тускло освещенном офисе. Он был стандартизирован Международной электротехнической комиссией (МЭК) как IEC 61966-2-1. Цветовое пространство sRGB примерно соответствует гамма-коррекции 2,2.
Предоставляет ли это расширение какие-либо форматы кадрового буфера sRGB или гарантирует, что изображения, визуализированные с текстурами sRGB, будут «хорошо выглядеть» при выводе на устройство, поддерживающее цветовое пространство sRGB?
RESOLVED: No. Whether the displayed framebuffer is displayed to a monitor that faithfully reproduces the sRGB color space is beyond the scope of this extension. This involves the gamma correction and color calibration of the physical display device. With this extension, artists can author content in an sRGB color space and provide that sRGB content for use as texture imagery that can be properly converted to linear RGB and filtered as part of texturing in a way that preserves the sRGB distribution of precision, but that does NOT mean sRGB pixels are output to the framebuffer. Indeed, this extension provides texture formats that convert sRGB to linear RGB as part of filtering. With programmable shading, an application could perform a linear RGB to sRGB conversion just prior to emitting color values from the shader. Even so, OpenGL blending (other than simple modulation) will perform linear math operations on values stored in a non-linear space which is technically incorrect for sRGB-encoded colors. One way to think about these sRGB texture formats is that they simply provide color components with a distribution of values distributed to favor precision towards 0 rather than evenly distributing the precision with conventional non-sRGB formats such as GL_RGB8.