c++ - 如何为第 3 方渲染提供空 QML 项的 OpenGL 上下文?

标签 c++ qt opengl qml qtquick2

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

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

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

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

最佳答案

你应该看看 QQuickFramebufferObject。

它的工作方式:

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

Renderer *QQuickFramebufferObject::createRenderer()

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

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

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

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

这里有一些很好的例子

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

关于c++ - 如何为第 3 方渲染提供空 QML 项的 OpenGL 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46279614/

相关文章:

c++ - Qt 顶点数组不适用于 QImage

qtWebengineProcess 无法启动

c++ - 在 QT5 中将信号连接到 c++11 lambda

c++ - 在OpenGL中绘制完全白色的纹理

java - C++ 相当于使用 Entry<?扩展 A 类,? extends ClassB> getEntries() 用于两个以上的 java 参数

c++ - 如何将一个结构体的地址分配给另一个结构体?

c++ - C/C++中是否有称为 "hypochecking"的术语?

python - three.js 到 webGL 到 OpenGL

c++ - Open_GL 中的透视问题

c++ - 由于第三方库的名称冲突导致的段错误