2012-01-28 7 views
0

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

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

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

Bad blending

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

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

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

ответ

1

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

Это имело смысл вплоть до последнего шага.

image format that uses the sRGB colorspace означает, что доступ к текстурам из этой текстуры будет автоматически будет преобразован из цветового пространства sRGB в линейное цветовое пространство. Это происходит само по себе, когда вы извлекаете тексели из текстуры. Это бесплатно. Поэтому вам не нужно делать никаких «sRGB-> линейных» вычислений вообще.

Точно так же, когда вы включили GL_FRAMEBUFFER_SRGB при визуализации к изображению, которое использует SRGB цветового пространства, значение вы пишете к этому изображению считаетесь линейная. Включив GL_FRAMEBUFFER_SRGB, то, что вы сообщаете OpenGL, это преобразовать линейные значения, которые вы пишете в значения цветового пространства sRGB. Это снова бесплатно, и отлично работает с смешиванием и сглаживанием. Таким образом, вам не придется выполнять ручное преобразование.

Так что, действительно, вам нужно обеспечить правильную линейную контур цвета. Любые ваши текстуры, созданные в цветовом пространстве sRGB, должны использовать форматы изображений в цветовом пространстве sRGB.Это гарантирует, что значения, которые вы получаете от них в шейдере, линейны, поэтому на самом деле работает математика освещения. Когда вы пишете значения цвета, вам нужно записать их в фреймбуфер с цветовым пространством sRGB, с включенным GL_FRAMEBUFFER_SRGB. Это обеспечит правильное преобразование линейных значений из вашего шейдера в sRGB для отображения.

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

+0

Вы абсолютно правы, я должен был внимательно прочитать SuperBible, он утверждает, что вы сказали. Однако кажется, что Qt не дает возможности указать тип буферного хранилища для его видовых экранов - что менее впечатляет. Не только это, Qt представляет каждый из его компонентов с разными состояниями, но они предназначены для другого вопроса SO ... Последнее, если бы я попытался отобразить вывод шейдера в буфер, который не имел 'GL_FRAMEBUFFER_SRGB', он выглядит слишком ярким или слишком темным? – cmannett85

+0

@ cbamber85: Если ваш шейдер записывает линейные значения, ожидая, что они будут сохранены как sRGB, тогда да, это получится неправильно. Это все о том, что ожидает ваш шейдер. –