如何为第 3 方渲染提供空 QML 项的 OpenGL 上下文?
How to provide OpenGL context of empty QML Item for 3rd party render?
我的应用程序包含第 3 方代码,它使用 OpenGL 绘制某些东西。我唯一能做的就是为它提供全屏表面和 mouse/touchscreen 事件。假设我可以创建全屏大小的 Item
并将其留给第 3 方渲染。渲染器为我发出一些信号(可能来自任意线程,通过 QMetaObject::invokeMethod
)来更新视图。如何暂时阻止QML画入上下文?
上述如何实现?创建这样的工作流程在技术上是否可行?
有没有更明智的方法来实现期望。也许使用 FBO 会更好?
我可以异步执行此操作吗? IE。该渲染器将自己的消息队列放入单独的线程中。
你应该看看 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)其渲染器组件的渲染方法并调用更新。
这里有一些很好的例子
我的应用程序包含第 3 方代码,它使用 OpenGL 绘制某些东西。我唯一能做的就是为它提供全屏表面和 mouse/touchscreen 事件。假设我可以创建全屏大小的 Item
并将其留给第 3 方渲染。渲染器为我发出一些信号(可能来自任意线程,通过 QMetaObject::invokeMethod
)来更新视图。如何暂时阻止QML画入上下文?
上述如何实现?创建这样的工作流程在技术上是否可行?
有没有更明智的方法来实现期望。也许使用 FBO 会更好?
我可以异步执行此操作吗? IE。该渲染器将自己的消息队列放入单独的线程中。
你应该看看 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)其渲染器组件的渲染方法并调用更新。
这里有一些很好的例子