Цветовое пространство. Ну, все знают о RGB: три значения, нормированные в диапазоне [0.0,1.0], которые имеют значение интенсивности цветовых компонентов Red Green Blue; эта интенсивность называется линейной, не?
Gamma. Насколько я понимаю, гамма - это функция, которая сопоставляет цветовые компоненты 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.