OpenGL: изображение с гамма-коррекцией не выглядит линейным

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

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

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

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 не выбирает цвета в линейном пространстве? Или мое "нелинейное" изображение на самом деле является правильным линейным результатом, но оно просто не кажется мне линейным?

Мой вопрос является своего рода дубликатом этого: нужно ли мне гамма-коррекцию для получения окончательного цветного изображения на современном компьютере / мониторе? К сожалению, принятый ответ крайне запутанный, и некоторые его части кажутся мне противоречивыми, или, по крайней мере, нет полностью объяснил для кого-то менее знающего, чем ответчик.

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам