Я пытаюсь поиграть с QOpenGLFramebufferObject, чтобы посмотреть, как это может повлиять на производительность приложения, над которым я работаю.
У меня есть QOpenGLFramebufferObject fbo, который я использую, чтобы нарисовать простую линию:
void Example::drawLine() {
fbo->bind();
glBegin(GL_LINES);
glVertex2f(0, 0);
glVertex2f(100, 100);
glEnd();
fbo->release();
}
Если я конвертирую объект фреймбуфера в изображение и отображаю это изображение в виджете, строка отображается правильно:
void Example::paintGL() { // This implementation works.
drawLine();
QPainter painter(this);
painter.beginNativePainting();
auto im = fbo->toImage();
painter.drawImage(QPoint(0, 0), im);
painter.endNativePainting();
}
Однако если я попытаюсь использовать текстуры (а, насколько я понимаю, мне следует использовать текстуры, если производительность имеет значение), то виджет ничего не отображает:
void Example::paintGL() { // This one doesn't display anything.
drawLine();
fbo->bind();
glBindFramebuffer(GL_FRAMEBUFFER, fbo->handle());
glBindTexture(GL_TEXTURE_2D, fbo->texture());
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f, 1.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
fbo->release();
}
Что мне не хватает?
(Примечание: я упростил этот фрагмент кода, чтобы его было легче читать; в реальном коде я выполняю дополнительные проверки для glGetError и проверяю, что bind и release возвращают true.)





При работе с дополнительным фреймбуфером строка:
glBindFramebuffer(GL_FRAMEBUFFER, 0);
конечно неправильно.
Весь рендеринг происходит в объекте фреймбуфера OpenGL. makeCurrent() убедитесь, что он связан с контекстом. Имейте это в виду, когда создание и привязка дополнительных объектов фреймбуфера при рендеринге код в PaintGL(). Никогда не привязывайте повторно фреймбуфер с идентификатором 0. Вместо этого вызовите defaultFramebufferObject(), чтобы получить идентификатор, который должен быть привязан.
согласно ссылке QOpenGLWidget.
Не знал этого. Действительно, теперь, когда я удалил
glBindFramebuffer, он работает безупречно. Спасибо.