Использование цвета sRGB в QGLFramebufferObject с мультисэмплингом - PullRequest
0 голосов
/ 29 января 2012

По соображениям производительности я разделил 2D и 3D рендеринг.У меня есть два объекта QGLFramebufferObject для каждого типа, потому что QGLFramebuffer не поддерживает мультисэмплирование с GL_TEXTURE_2D в качестве цели, поэтому после рисования в буфер мультисэмплирования он помещается в «нормальный» QGLFramebufferObject, где разрешаются значения пикселей.Как только это будет сделано для одного / обоих типов рендеринга, буферы используются в качестве текстурных входов для шейдера, который смешивает 2D «слой» с 3D.

Я должен упомянуть, что я заблокированиспользовать QGLFramebufferObjects вместо чистых объектов OpenGL, потому что я использую QPainter для всей 2D-работы, а QPainter может рисовать только на типах Qt.

Этот процесс работает нормально, за исключением того, что сглаживание слишком темное, оно выглядит почти кактемный контур:

Bad blending

После некоторых исследований я обнаружил, что это сводится к использованию линейного цветового пространства вместо sRGB ( здесь и здесь ).Таким образом, я включил GL_FRAMEBUFFER_SRGB для блиттинга моего FBO, установил внутренний тип целевого объекта текстуры для всех моих FBO на GL_SRGB8_ALPHA8 и выполнил sRGB-> Linear перед вычислениями смешивания в моем шейдере (и снова перед финальным выводом).

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

Я действительно мог бы сделать с кем-то объяснение порядка операций для включения состояния GL_FRAMEBUFFER_SRGB, если блиттинг повлияет на цветовое пространство, и какие FBOsчтобы сглаживание выглядело правильно, нужно быть в sRGB.Или я совершенно не прав, и это что-то совершенно другое вызывает эти артефакты мультисэмплинга?

1 Ответ

1 голос
/ 29 января 2012

Таким образом, я включил 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.

...