Цветовое пространство . Что ж, про RGB знают все: три значения, нормированные в диапазоне [0.0,1.0], которые имеют значение интенсивности цветовых компонентов Красный Зеленый Синий; эта интенсивность считается линейной, не так ли?
Гамма . Насколько я понимаю, гамма - это функция, которая сопоставляет компоненты цвета RGB с другим значением. Погуглив по этому поводу, я видел линейные функции и нелинейные функции ... Кажется, что линейные функции масштабируют компоненты RGB, поэтому кажется, что они настраивают яркость изображения; нелинейные функции, кажется, «распаковывают» более темные / более светлые компоненты.
Теперь я начинаю реализовывать программу просмотра изображений, которая будет отображать различные форматы изображений в виде текстуры. Я хотел бы изменить гамму этих изображений, поэтому я должен создать фрагментный шейдер и запустить текстурированный четырехугольник. Хорошо, но как мне определить правильную гамма-коррекцию?
OpenGL работает с использованием линейного цветового пространства RGB и компонентов с плавающей запятой. В самом деле, я мог вычислить значения с гамма-коррекцией, начиная с этих значений (со специальной точностью с плавающей запятой), чтобы они отображались после фиксации значения с гамма-коррекцией.
Сначала я определю гамма-кривую. Как я мог это определить? (аналитически или с использованием таблиц поиска)
Затем я подошел к исследованию расширения OpenGL EXT_framebuffer_sRGB, которое, кажется, очень связано с расширением EXT_texture_sRGB .
EXT_texture_sRGB представляет новый формат текстуры, который используется для линеаризации значений textel в линейное пространство 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?
РЕШЕНИЕ: Нет. Отображается ли отображаемый буфер кадра на мониторе, который точно воспроизводит цветовое пространство sRGB выходит за рамки возможностей этого расширения. Это включает в себя коррекцию гаммы и цвета калибровка физического устройства отображения. С помощью этого расширения художники могут создавать контент в цвете sRGB. пространство и предоставить это содержимое sRGB для использования в качестве изображений текстуры которые можно правильно преобразовать в линейный RGB и отфильтровать как часть текстурирования таким образом, чтобы сохранить распределение sRGB точность, но это НЕ означает, что выводятся пиксели sRGB в фреймбуфер. Действительно,это расширение предоставляет текстуру форматы, которые преобразуют sRGB в линейный RGB как часть фильтрации. С помощью программируемого затенения приложение может выполнять преобразование линейного RGB в sRGB непосредственно перед излучением цвета значения из шейдера. Даже в этом случае смешивание OpenGL (кроме простая модуляция) будет выполнять линейные математические операции со значениями хранится в нелинейном пространстве, что технически некорректно для Цвета в кодировке sRGB. Один из способов подумать об этих форматах текстур sRGB состоит в том, что они просто предоставить цветовым компонентам распределение значений распределены в пользу точности до 0, а не равномерно распределение точности с обычными форматами без sRGB например GL_RGB8.