Как мне ввести значения цвета в пространстве sRGB? - PullRequest
1 голос
/ 14 июня 2019

Я изучаю цветовое пространство sRGB в OpenGL.

Одно - это цвета из текстур, а другое - прямые значения цвета, скажем, из графического редактора.

Компонент цвета 0,5 означает, что на экране будет более светлый цвет, 187.

Какова лучшая практика - нужно ли декодировать цвета перед использованием, вычисляя корень?

1 Ответ

1 голос
/ 15 июня 2019

Если текстуры заданы с внутренними форматами GL_SRGB8 или GL_SRGB8_ALPHA8, тогда OpenGL обрабатывает линейное преобразование sRGB для вас при выборке текстуры. Для всех других значений цвета (униформа, атрибуты вершин, чистые цвета и т. Д.) Вам необходимо выполнить преобразование вручную.

Преобразование из sRGB в линейное очень просто. Вы можете найти функцию в википедии и перевести ее на любой язык, который вам нравится. Например, в C:

float srgb_to_linear(float x) {
    return x <= 0.04045f ? x / 12.92f : powf((x + 0.055f)/1.055f, 2.4f);
}

Преобразует один компонент sRGB в диапазоне [0,1] в линейный в диапазоне [0,1]. Чтобы конвертировать из 8-битного sRGB, как представляет большинство графических редакторов, разделите каждый компонент на 255., а затем примените вышеуказанную функцию к каждому из них:

void srgb8_to_linear(uint8_t in[3], float out[3]) {
    for(int i = 0; i < 3; ++i)
        out[i] = srgb_to_linear(in[i]/255.f);
}

Если производительность имеет значение, может быть полезно предварительно вычислить таблицу поиска для всех 256 различных значений.

Обратите внимание, что важно преобразовать в линейный раньше, чем позже. Например. если вы передадите эти цвета как интерполированные атрибуты вершин, вам следует сохранить линейные значения в VBO, иначе вы получите неправильную интерполяцию.

...