Текстура с плавающей запятой QGLFramebufferObject

Мне нужно выполнить рендеринг в объект фреймбуфера с GL_FLOAT в качестве внутреннего формата для вычислений с плавающей запятой. Я знаю, как добиться этого, используя собственные вызовы OpenGL, например:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height,
             0, GL_RGBA, GL_FLOAT, NULL);

Чтобы использовать QPainter для рендеринга в FBO, QGLFramebufferObject. Однако QGLFramebufferObject не позволяет устанавливать тип, а только внутренний формат и формат текстуры (который в моем случае используется в прикреплении цвета).

Есть ли способ использовать точность с плавающей запятой с QGLFramebufferObject в Qt 4.8?

Я знаю, что могу каким-то образом исправить и перекомпилировать Qt, но это громоздко и не очень элегантно. Я также рассматривал возможность написания собственного класса FramebufferObject, но тогда один из них должен быть производным от QPaintDevice и, таким образом, предоставлять собственный QPaintEngine. Не очень хорошее решение, так как Qt, очевидно, имеет для этого движок, но он недоступен.


person user1743345    schedule 13.10.2012    source источник


Ответы (1)


Внутренний формат — это единственное, что делает текстуру вещественной. Например:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height,
         0, GL_RGBA, GL_FLOAT, NULL);

Это не текстура с плавающей запятой. Это 8-битная нормализованная текстура без знака на компонент. Потому что именно это означает GL_RGBA8.

Поэтому просто установите внутренний формат QGLFramebufferObject в один из доступных форматов с плавающей запятой.

person Nicol Bolas    schedule 13.10.2012
comment
Большое спасибо! Это не было ясно из документации opengl. - person user1743345; 15.10.2012