Должен ли выход шейдера WebGL настраиваться на гамму?

Если шейдер WebGL-фрагмента выводит gl_FragColor значения RGB, которые являются линейными или для некоторой мощности 1/ γ, чтобы исправить отображение гаммы? Если последнее, есть конкретное значение для использования или должно быть настроено для полного приложения?

Спецификация WebGL в настоящее время не содержит "гамма", "γ" или соответствующее использование "линейных", а GL_ARB_framebuffer_sRGB extension недоступен в WebGL. Есть ли другая применимая спецификация? Если это недоказано, что делают текущие реализации? Хороший ответ будет оценен.

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

Ответ 1

Это сложный вопрос, но из того, что я смог вытащить (в основном из этой ветки электронной почты), похоже, что текущее поведение заключается в том, чтобы гамма-коррекция изображений линейного цветового пространства (таких как PNG) они загружены. Такие вещи, как JPEG, загружаются без какого-либо преобразования, потому что они уже гамма-скорректированы. (Источник: https://www.khronos.org/webgl/public-mailing-list/archives/1009/msg00013.html) Это будет означать, что текстуры могут быть переданы в WebGL в нелинейном пространстве, что может быть проблематично. Я не уверен, изменилось ли это с конца 2010 года.

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

Извините, если это не дает авторитетного ответа на ваш вопрос, я просто копаю, что могу по этому вопросу. Что касается вопроса о том, нужно ли вам делать коррекцию в шейдере, я бы сказал, что ответом будет "нет", поскольку предполагается, что вывод WebGL будет линейным, и попытка самокоррекции может привести к для двойного преобразования цветового пространства.

Ответ 2

Когда я упомянул этот вопрос на Freenode #webgl (29 июня 2012 г.), Florian Boesch энергично выразил мнение, что почти все системы пользователей безнадежно неправильно настроены в отношении гаммы, и поэтому единственный способ получить хорошие результаты - предоставить гамма-вариант в приложении WebGL, так как даже если WebGL задал цветовое пространство (линейное или нелинейное) для данных фреймбуфера, оно не будет правильно преобразовано для монитора.