如何为 3rd 方渲染提供空 QML 项的 OpenGL 上下文?

Posted

技术标签:

【中文标题】如何为 3rd 方渲染提供空 QML 项的 OpenGL 上下文?【英文标题】:How to provide OpenGL context of empty QML Item for 3rd party render? 【发布时间】:2017-09-18 12:44:36 【问题描述】:

我的应用程序包含第 3 方代码,它使用 OpenGL 绘制某些东西。只有我能做的是为它和鼠标/触摸屏事件提供全屏界面。假设我可以创建全屏大小的Item 并将其留给第 3 方渲染。渲染器为我发出一些信号(可能来自任意线程,通过QMetaObject::invokeMethod)来更新视图。如何暂时阻止 QML 绘制到上下文中?

上面描述的如何实现?创建这样的工作流程在技术上是否可行?

有没有更明智的方法来实现期望。也许使用 FBO 会更好?

我可以异步执行此操作吗? IE。渲染有自己的消息队列到单独的线程中。

【问题讨论】:

Qt Quick Scene Graph 文档页面描述了集成的各种选项。这将有助于使问题更具体。 【参考方案1】:

你应该看看 QQuickFramebufferObject。

它的工作方式:

您创建一个子类并在 QML 中实例化它。你应该覆盖它的

Renderer *QQuickFramebufferObject::createRenderer()

您创建自己的渲染器子类http://doc.qt.io/qt-5/qquickframebufferobject-renderer.html

您在其 void Renderer::render() 中放置的所有代码都会影响 FBOItem 并呈现到屏幕上。 Qt 负责绑定你的 FBO。

现在,如果您需要在 UI 中调用修改,请致电 void Renderer::update()

您的第三方渲染器应该在需要绘制时调用此方法,但您的所有 opengl 方法(glDrawArrays ...)都应该写在渲染器的渲染函数中。 Qt 在访问此方法之前绑定您的 FBO。也许您的 QQuickFramebufferObject 应该监听您的 ThirdParty 信号并修改(通过某些状态或 std::functions)其 Renderer 组件的渲染方法并调用更新。

这里有一些很好的例子

http://blog.qt.io/blog/2015/05/11/integrating-custom-opengl-rendering-with-qt-quick-via-qquickframebufferobject/

【讨论】:

以上是关于如何为 3rd 方渲染提供空 QML 项的 OpenGL 上下文?的主要内容,如果未能解决你的问题,请参考以下文章

为 GCM 实现 3rd 方应用服务器

如何为windeployqt设置qml输出目录

如何在操场上安装 3rd 方依赖项(如 Alamofire)

如何为 Windows XP 部署 Qt/QML 应用程序

Qml:如何为所有 GridView 项目设置属性

如何为 QML 创建一个动态的全局主题?