我使用Qt官方的fboitem示例,但无法正确渲染。 createRenderer应该是框架内部自动调用的,打印日志发现没有调用,所以没有进行渲染。
但是为什么不自动调用呢?
查看Qt官方提到只有当前程序使用OpenGL渲染时才会调用,但是如何设置程序支持OpenGL渲染呢? https://doc.qt.io/qt-6/qquickframebufferobject.html
这是简单的代码
class FboInSGRenderer : public QQuickFramebufferObject
{
Q_OBJECT
QML_NAMED_ELEMENT(Renderer)
public:
Renderer *createRenderer() const;
};
class LogoInFboRenderer : public QQuickFramebufferObject::Renderer
{
public:
LogoInFboRenderer()
{
logo.initialize();
}
void render() override {
logo.render();
update();
}
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) override {
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setSamples(4);
return new QOpenGLFramebufferObject(size, format);
}
LogoRenderer logo;
};
QQuickFramebufferObject::Renderer *FboInSGRenderer::createRenderer() const
{
qDebug() << "#createRenderer call......";
return new LogoInFboRenderer();
}
int main(int argc, char **argv)
{
QGuiApplication app(argc, argv);
QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:///scenegraph/fboitem/main.qml"));
view.show();
return app.exec();
}
那么我哪里出错了?
我的开发环境:
Qt 5.15.2 MinGW64
Windows 10 Pro
Processor: Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz 2.30 GHz
Graphics Card: NVIDIA GeForce MX330
问题解决了
我的本地注册表被某些软件修改了
QMLSCENE_DEVICE =softwarecontext
所以,只要删除这个并重新启动电脑就可以了
在 Qt 6 中,至少在 Qt 6.7 中,在加载 QML 之前可能需要在 main.cpp 中添加以下调用:
QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);
在
isOpenGL()
内部有对 QQuickFramebufferObject::updatePaintNode()
的调用,如果返回 false
将阻止调用 createRenderer()
。