Flickering FBO When Resizing Vertically
-
I get a flickering when QQuickFramebufferObject is vertically resized. Oddly enough, there is no flickering when resizing horontally. Here is the code:
file main.qml:
@import QtQuick 2.3
import QtQuick.Controls 1.1
import QtQuick.Layouts 1.1
import Tools 1.0ApplicationWindow {
width: 1000; height: 400
visible: true
toolBar: ToolBar {
RowLayout {
anchors.fill: parent
ToolButton { id: button1; text: "button1"; anchors.left: parent.left }
ToolButton { id: button2; text: "button2"; anchors.left: button1.right }
}
}
RowLayout {
anchors.fill: parent
ColumnLayout {
id: col1
anchors.left: parent.left; Layout.fillHeight: true
Button { id: button3; text: "button3"; width: 100 }
Button { id: button4; text: "button4"; width: 100; anchors.top: button3.bottom }
}
Rectangle {
anchors.left: col1.right; anchors.right: parent.right; Layout.fillHeight: true
Renderer { anchors.fill: parent }
}
}
}@file main.cpp:
@#include <QApplication>
#include <QQmlApplicationEngine>
#include "fbo.h" // FBOint main(int argc, char *argv[]) {
QApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<FBO>("Tools", 1, 0, "Renderer");
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
app.exec();
return 0;
}@file fbo.h:
@#ifndef FBO_H
#define FBO_H
#include <QQuickFramebufferObject>
#include "fborenderer.h" // FboRendererclass FBO : public QQuickFramebufferObject {
Q_OBJECT
public:
Renderer* createRenderer() const { return new FboRenderer(); }
};
#endif // FBO_H@file fborenderer.h:
@#ifndef FBORENDERER_H
#define FBORENDERER_H
#include <QQuickFramebufferObject> // QQuickFramebufferObject
#include <QOpenGLFramebufferObject> // QOpenGLFramebufferObjectclass FboRenderer : public QQuickFramebufferObject::Renderer {
public:
void render();
QOpenGLFramebufferObject* createFramebufferObject(const QSize &size);
};
#endif // FBORENDERER_H@file fborenderer.cpp:
@#include "fborenderer.h"
#include "fbo.h" // FBOvoid FboRenderer::render() {
glClearColor(0.6, 0.1, 0.2, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
QOpenGLFramebufferObject* FboRenderer::createFramebufferObject(const QSize& size) {
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setSamples(16);
return new QOpenGLFramebufferObject(size, format);
}@As mentioned earlier, the minor flickering is there only when the scenegraph is resized vertically. I am running qt5.3.2(gcc 4.6.1, 64bit) on Linux Centos 6.5.
As far as I can tell, changing the qml rendering does not fix this. I tried digging in the source files and I couldn't find any difference between how height change is handled versus how width change is.
I also get same flickering for Scene Graph FBO examples (http://doc.qt.io/qt-5/qtquick-scenegraph-textureinthread-example.html and http://doc.qt.io/qt-5/qtquick-scenegraph-textureinsgnode-example.html .) I didn't notice any difference between resizing vertically and horizentally when using classic opengl with glwidget. It seems slower and flickering when resizing in both directions.