Если текстуры заданы с внутренними форматами 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, иначе вы получите неправильную интерполяцию.