Я использую OpenGL для рендеринга, и когда я пишу линейные значения в стандартную фреймбуферу (без какой-либо гамма-коррекции), они кажутся линейными на моем мониторе. Это противоречит всему, что я думал о гамма-коррекции (как описано здесь: http://gamedevelopment.tutsplus.com/articles/gamma-correction-and-why-it-matters--gamedev-14466). Без гамма-коррекции я ожидал бы, что средние цвета будут затемнены нелинейным монитором.OpenGL: изображение с исправленной гамма-индикацией не отображается линейно
Но вот что я на самом деле вижу; сначала с гамма-коррекцией с моей стороны, затем с гамма-коррекцией:
Вот мой шейдер фрагмента без гамма-коррекции (нарисованный на полноэкранном квадре к фреймбуферу по умолчанию). Это приводит к линейному изображению слева:
out vec4 fsOut0;
void main(void)
{
// split the screen into 10 discrete color bands
float yResolution = 768.0;
int intVal = int(gl_FragCoord.y/yResolution * 10.0);
fsOut0.rgb = vec3(float(intVal)/10.0);
fsOut0.a = 1.0;
}
И вот шейдер с добавлением гамма-коррекции (от линейного пространства SRGB). Это приводит к более ярким, чем линейное изображение справа:
out vec4 fsOut0;
void main(void)
{
// split the screen into 10 discrete color bands
float yResolution = 768.0;
int intVal = int(gl_FragCoord.y/yResolution * 10.0);
fsOut0.rgb = vec3(float(intVal)/10.0);
// gamma correction
fsOut0.rgb = pow(fsOut0.rgb, vec3(1.0/2.2));
fsOut0.a = 1.0;
}
Я проверки того или нет цвета линейны, просто посмотрев на них, а также с помощью палитры цветов в Photoshop и глядя на различия в значениях RGB между цветовыми полосами. Для линейно-выглядящего изображения разница между каждым цветом (в основном) постоянна.
Я также попробовал запросить фреймбуфер с поддержкой sRGB. В этом случае запись линейных значений без гамма-коррекции выглядит как второе изображение (нелинейное).
Что я делаю неправильно? Или может быть, что мои два монитора оба искажены и что Photoshop не выбирает цвета в линейном пространстве? Или мое «нелинейное» изображение на самом деле является правильным линейным результатом, но оно просто не кажется линейным для моих глаз?
Мой вопрос является своего рода дубликатом этого: Do I need to gamma correct the final color output on a modern computer/monitor К сожалению, принятый ответ крайне запутанным и его части я был в состоянии следовать кажутся противоречащими друг другу, или, по крайней мере, не в полной мере объяснить для кого-то менее осведомленным, чем отвечающего.
«с помощью выбора цвета в фотошопе» это не работает. Это * монитор * гамма, а не гамма гаммы кадров. Если вы записываете линейные значения в fb, ypu будет читать линейные значения из fb. Вы должны * измерить свет, который поступает с монитора *. –
@ н.м. У меня создалось впечатление, что значения выбора цвета не совпадают с значениями framebuffer. (Итак, Photoshop сохранит изображение в sRGB, а затем преобразуется в линейный RGB перед отображением чисел в подборщике цветов). И я измеряю свет, который исходит от моего монитора - глазами.Я думал, что гамма-коррекция должна приводить к появлению линейных цветов. – KTC
«хранит изображение в sRGB», откуда он получает sRGB * от *? –