Я хочу реализовать гамма-коррекцию для моего освещения 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)
};
С каждым источником света разделенным и основным линейным затуханием, приложенным к диффузным уравнению освещения я получаю следующие результаты:
Это пиксельный шейдер:
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 раза ярче, чем левый круг, и в два раза ярче второго круга, который на самом деле не так.
Является ли это тем, что я недостаточно чувствителен, чтобы воспринимать правильные различия яркости или что-то не так?
Что-то еще, что я пробовал, просто выводит точные световые цвета на фреймбуфер по умолчанию без и с гамма-коррекцией.
Левые откорректировано, право с гамма-коррекцией; с красными цифрами, указывающими интенсивность RGB из набора цветов Photoshop. Я знаю, что значения RGB Photoshop не представляют собой конечное выходное изображение (поскольку Photoshop не считывает значения RGB в качестве выходов монитора). Левое изображение интуитивно кажется лучше, но, основываясь на значениях интенсивности RGB, я бы сказал, что самое правильное изображение действительно правильно гамма-исправлено моим шейдером фрагмента; так как каждая из этих интенсивностей пройдет через монитор и войдет в мой глаз с правильной интенсивностью. Например, интенсивность 0,75 в качестве коррекции 0,88 гамма составляла 0,88 2,2 0,75 в качестве выхода монитора.
Правильное ли изображение действительно правильно? А также, почему фактическое освещение отключается по сравнению с другими изображениями?
Первое предложение в статье в Википедии об гамма-коррекции: «гамма, это название нелинейной операции, используемой для кодирования и декодирования яркости» –
Прошу прощения, но я не понимаю, как это утверждение помогает в этом случае, Я пишу что-то неправильно о Гамма? – ABHAY
Я просто указывал на использование слова «нелинейный» в описании. Это был комментарий, а не ответ, потому что я не нашел времени, чтобы дать полное объяснение, как это сделал derhass, но чтение статьи в википедии помогло бы вам и вашему пониманию. –