2015-04-22 2 views
2

Я хочу реализовать гамма-коррекцию для моего освещения OpenGL, но с применением гамма-коррекции мои результаты не кажутся линейными.Гамма-коррекция не выглядит правильно исправленной, это линейная?

Я также нашел OpenGL: Gamma corrected image doesn't appear linear, который очень похож на мою проблему, но еще не получил ответа и не обсуждал фактические диффузные огни.

В качестве иллюстрации, я следующие 4 светлых тонов определены в линейном пространстве:

glm::vec3 lightColors[] = { 
    glm::vec3(0.25), 
    glm::vec3(0.50), 
    glm::vec3(0.75), 
    glm::vec3(1.00) 
}; 

С каждым источником света разделенным и основным линейным затуханием, приложенным к диффузным уравнению освещения я получаю следующие результаты:

wrong gamma

Это пиксельный шейдер:

void main() 
{   
    vec3 lighting = vec3(0.0); 
    for(int i = 0; i < 4; ++i) 
     lighting += Diffuse(normalize(fs_in.Normal), fs_in.FragPos, lightPositions[i], lightColors[i]); 
    // lighting = pow(lighting, vec3(1.0/2.2)); 
    FragColor = vec4(lighting, 1.0f); 
} 

Мало того, что я не вижу различий в яркости с гамма-коррекцией, ослабление также искажается гамма-коррекцией. Насколько я понимаю, все вычисления (в том числе затухание) выполняются в линейном пространстве, и, исправив гамму, монитор должен отображать его правильно (поскольку он не исправляет его снова как выход). Основываясь только на цветах освещения, правый круг должен быть в 4 раза ярче, чем левый круг, и в два раза ярче второго круга, который на самом деле не так.

Является ли это тем, что я недостаточно чувствителен, чтобы воспринимать правильные различия яркости или что-то не так?

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

gamma output

Левые откорректировано, право с гамма-коррекцией; с красными цифрами, указывающими интенсивность RGB из набора цветов Photoshop. Я знаю, что значения RGB Photoshop не представляют собой конечное выходное изображение (поскольку Photoshop не считывает значения RGB в качестве выходов монитора). Левое изображение интуитивно кажется лучше, но, основываясь на значениях интенсивности RGB, я бы сказал, что самое правильное изображение действительно правильно гамма-исправлено моим шейдером фрагмента; так как каждая из этих интенсивностей пройдет через монитор и войдет в мой глаз с правильной интенсивностью. Например, интенсивность 0,75 в качестве коррекции 0,88 гамма составляла 0,88 2,2 0,75 в качестве выхода монитора.

Правильное ли изображение действительно правильно? А также, почему фактическое освещение отключается по сравнению с другими изображениями?

+0

Первое предложение в статье в Википедии об гамма-коррекции: «гамма, это название нелинейной операции, используемой для кодирования и декодирования яркости» –

+0

Прошу прощения, но я не понимаю, как это утверждение помогает в этом случае, Я пишу что-то неправильно о Гамма? – ABHAY

+0

Я просто указывал на использование слова «нелинейный» в описании. Это был комментарий, а не ответ, потому что я не нашел времени, чтобы дать полное объяснение, как это сделал derhass, но чтение статьи в википедии помогло бы вам и вашему пониманию. –

ответ

6

Результаты, которые вы получаете, - это то, что следует ожидать.

Вы, кажется, путаете физическое радиометрическое излучение, создаваемое дисплеем, с ярко выраженной яркостью человека. Последний является нелинейным, а простая гамма-модель - способ приблизить это. В основном, монитор инвертирует нелинейную трансформацию человеческого глаза, так что стандартное (нелинейное) пространство RGB воспринимается линейно - использование интенсивности RGB 0.5 воспринимается как примерно наполовину яркое, как 1.0, и так далее.

Если вы разместите колориметр или спектрофотометр на вашем дисплее, когда будете отображать гамма-корректированные уровни оттенков серого, вы действительно увидите, что 0.73 будет показывать примерно 50% яркости белого уровня в candela/m^2 (если вы не слишком сильно отклоняетесь от модели sRGB, которая, кстати, не использует гамма 2.2, а линейный сегмент в сочетании с гамма 2.4 для остальных, 2.2 - только другое приближение).

Теперь встает вопрос: чего именно вы хотите достичь? Работа в линейном цветовом пространстве обычно требуется, если вы хотите выполнять физически точные вычисления. Но тогда источник света с 50% яркости другого не может быть примерно наполовину ярким для человека, и результат, который вы получили, в основном правильный.

Если вы хотите просто иметь цветовое пространство, которое является линейным в ярко выраженной яркости, вы можете полностью пропустить гамма-коррекцию, так как sRGB безупречно пытается это сделать. Вам может потребоваться некоторая калибровка цвета или небольшая гамма-регулировка, чтобы исправить отклонения, представленные вашим дисплеем, если вы хотите получить точные результаты.

+0

Все эти уровни коррекции и нелинейные пространства меня путают в значительной степени. Поэтому, если бы я все правильно понял: для физически правильных моделей я правильно моделирую его в данный момент (так что 50% -ный свет распространяется на половину количества фотонов, так как свет 100% физически), поэтому для моделей освещения это действительно правильная модель. Проблема была в том, что я также ожидал, что мои глаза будут воспринимать подобное увеличение яркости, которое, как вы говорите, неверно. – ABHAY

+0

В заключение я должен всегда использовать гамма-коррекцию и после этого исправлять освещение, поскольку я нахожу наиболее визуально приятным (что хорошо, потому что за кулисами вычисления физически правильны в линейном пространстве)? Кроме того, знаете ли вы, почему ослабление отключено с гамма-исправленной версией? Я подозреваю, что это не имеет значения? – ABHAY

+0

Ну. На самом деле трудно сказать, что вы должны использовать, когда контекст неизвестен. Что касается ослабления: ну, ваша гамма-коррекция нелинейно искажает цвета. Однако я не знаю, какую модель ослабления вы используете. Похоже, вы просто делаете это линейно, что, конечно, физически совершенно неверно, поскольку интенсивность исчезает с квадратом расстояния, что интересно выглядит почти «линейно» для человека. – derhass

Смежные вопросы