2015-03-20 5 views
5

Я использую OpenGL для рендеринга, и когда я пишу линейные значения в стандартную фреймбуферу (без какой-либо гамма-коррекции), они кажутся линейными на моем мониторе. Это противоречит всему, что я думал о гамма-коррекции (как описано здесь: http://gamedevelopment.tutsplus.com/articles/gamma-correction-and-why-it-matters--gamedev-14466). Без гамма-коррекции я ожидал бы, что средние цвета будут затемнены нелинейным монитором.OpenGL: изображение с исправленной гамма-индикацией не отображается линейно

Но вот что я на самом деле вижу; сначала с гамма-коррекцией с моей стороны, затем с гамма-коррекцией: enter image description here

Вот мой шейдер фрагмента без гамма-коррекции (нарисованный на полноэкранном квадре к фреймбуферу по умолчанию). Это приводит к линейному изображению слева:

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 К сожалению, принятый ответ крайне запутанным и его части я был в состоянии следовать кажутся противоречащими друг другу, или, по крайней мере, не в полной мере объяснить для кого-то менее осведомленным, чем отвечающего.

+2

«с помощью выбора цвета в фотошопе» это не работает. Это * монитор * гамма, а не гамма гаммы кадров. Если вы записываете линейные значения в fb, ypu будет читать линейные значения из fb. Вы должны * измерить свет, который поступает с монитора *. –

+0

@ н.м. У меня создалось впечатление, что значения выбора цвета не совпадают с значениями framebuffer. (Итак, Photoshop сохранит изображение в sRGB, а затем преобразуется в линейный RGB перед отображением чисел в подборщике цветов). И я измеряю свет, который исходит от моего монитора - глазами.Я думал, что гамма-коррекция должна приводить к появлению линейных цветов. – KTC

+0

«хранит изображение в sRGB», откуда он получает sRGB * от *? –

ответ

1

Ну, как ваши левые, так и правые фотографии, как и следовало ожидать. Они прекрасны, и да, я знаю свои вещи.

Это просто, что наши глаза также не очень линейны, т.е. 1/5 линейной интенсивности (интенсивность света) воспринимается как «наполовину яркая, как белый». Это то, что вы видите справа, в исправленном изображении, внизу.

Это причина того, что гамма присутствует в первую очередь - чтобы помочь кодировать, имитируя реакцию глаза. IOW, гамма делает линейный линейный скачок линейным.

Однако физически линейная рампа (как справа), следовательно, совершенно не воспринимается как линейная. Помните, что реальный мир имеет довольно большой динамический диапазон (с точки зрения силы света), и наши глаза компенсируют это. Это вас сбивает с толку, но, в отличие от многих других, вы действительно получили правильные цифры.

+0

Это более или менее дубликат этого: http://stackoverflow.com/questions/29806039/gamma-correction-doesnt-look-properly-corrected-is-this-linear?lq=1 –