Таким образом, я включил GL_FRAMEBUFFER_SRGB для блиттинга своего FBO, установил для внутреннего FBO целевого типа текстуры для всех моих FBO значение GL_SRGB8_ALPHA8 и выполнил sRGB-> Linear перед вычислениями смешивания в моем шейдере (и снова перед окончательным выводом).
Это имело смысл вплоть до последнего шага.
Формат изображения , использующий цветовое пространство sRGB , означает, что доступ к текстуре из этой текстуры автоматически будет преобразован из цветового пространства sRGB в линейное цветовое пространство. Это происходит само по себе, когда вы выбираете тексели из текстуры. Это бесплатно . Так что вам вообще не нужно выполнять какие-либо вычисления "sRGB-> Linear".
Аналогично, когда вы включили GL_FRAMEBUFFER_SRGB
при рендеринге изображения, использующего цветовое пространство sRGB, значения, которые вы записываете в это изображение, считаются линейными . Включив GL_FRAMEBUFFER_SRGB
, вы заставляете OpenGL преобразовывать линейные значения, которые вы записываете, в значения цветового пространства sRGB. Это опять бесплатно и прекрасно работает с наложением и сглаживанием. Опять же, вам не нужно делать никаких ручных преобразований.
Так что на самом деле вам нужно обеспечить правильно линейный конвейер цвета. Любые ваши текстуры, созданные в цветовом пространстве sRGB, должны использовать форматы изображений в цветовом пространстве sRGB. Это гарантирует, что значения, которые вы получаете от них в шейдере, являются линейными, поэтому математика освещения действительно работает. Когда вы записываете значения цвета, вам нужно записать их в кадровый буфер цветового пространства sRGB с включенным GL_FRAMEBUFFER_SRGB
. Это обеспечит правильное преобразование линейных значений, которые вы пишете из своего шейдера, в sRGB для отображения.
Последняя часть заключается в том, что вам необходимо убедиться, что ваш дисплей также является изображением sRGB. Я ничего не знаю об инициализации контекста Qt OpenGL, но если они не игнорировали OpenGL последние 4 года или около того, должен быть какой-то параметр, который вы можете использовать, чтобы заставить его создавать контекст с буферами цветового пространства sRGB.