По соображениям производительности я отделил свой 2D и 3D-рендеринг. У меня есть два объекта QGLFramebufferObject для каждого типа, потому что QGLFramebuffer не поддерживает мультисэмплинг с GL_TEXTURE_2D
в качестве цели, поэтому, как только рисование выполняется в мультисэмплинговом буфере, оно включено в «нормальный» объект QGLFramebufferObject, где значения пикселей разрешены. Как только это было сделано для одного/обоих типов рендеринга, буферы используются как входы текстур в шейдер, который смешивает 2D-слой на трехмерном.Использование цвета sRGB в QGLFramebufferObject с мультисэмплированием
Следует упомянуть, что я блокирован использованием QGLFramebufferObjects вместо чистых объектов OpenGL, потому что я использую QPainter для всех 2D-работ, а QPainter может рисовать только типы Qt.
Этот процесс работает отлично, за исключением сглаживания слишком темный, он выглядит почти как темный силуэт:
После выполнения некоторых исследований я обнаружил, что это вниз с помощью линейного цветового пространства вместо sRGB (here и here). Таким образом, я включил GL_FRAMEBUFFER_SRGB
для моего биения BBO, задал внутренний тип текстуры для всех моих FBO до GL_SRGB8_ALPHA8
и выполнил sRGB-> Linear перед смежными вычислениями в моем шейдере (и обратно до окончательного вывода).
Но это не работает; он выглядит слишком ярким, слишком темным или точно таким же. Всякий раз, когда весь кадр слишком темный/светлый, я знаю, это потому, что я пропустил преобразование цветового пространства. Но когда все выглядит точно так же - что происходит !?
Я мог бы действительно с кем-нибудь объяснить порядок операций для включения состояния GL_FRAMEBUFFER_SRGB
, если blitting повлияет на цветовое пространство и какие FBOs должны быть в sRGB для сглаживания, чтобы выглядеть правильно. Или я совершенно неправ, и это что-то еще, что вызывает эти многозадачные артефакты?
Вы абсолютно правы, я должен был внимательно прочитать SuperBible, он утверждает, что вы сказали. Однако кажется, что Qt не дает возможности указать тип буферного хранилища для его видовых экранов - что менее впечатляет. Не только это, Qt представляет каждый из его компонентов с разными состояниями, но они предназначены для другого вопроса SO ... Последнее, если бы я попытался отобразить вывод шейдера в буфер, который не имел 'GL_FRAMEBUFFER_SRGB', он выглядит слишком ярким или слишком темным? – cmannett85
@ cbamber85: Если ваш шейдер записывает линейные значения, ожидая, что они будут сохранены как sRGB, тогда да, это получится неправильно. Это все о том, что ожидает ваш шейдер. –