【发布时间】:2016-08-29 08:32:26
【问题描述】:
目标:
通过Qt5 OpenGL框架进行一些onscreen和offscreen渲染,这样资源可以很容易地在两个渲染部分之间共享。具体来说,
- 渲染工作通过offscreen部分完成(framebuffer可能比显示屏幕大);
-
屏幕外渲染的结果可以在不同的设置下显示在多个屏幕上部分(例如
QOpenGLWidgets),例如不同尺寸,为简单起见; -
离屏渲染的结果也可以从 GPU 中提取并保存到
QImage或cv::Mat对象中; - 上述任务可以异步执行(进行第二次离屏渲染,同时显示或提取第一个离屏结果)。
目前的解决方案:
由于我不知道如何在两个部分之间共享资源,因此在我当前的解决方案中,实际的渲染工作在两个部分中都是冗余完成的:
屏幕上部分:- 一个
QMainWindow包含多个QOpenGLWidget(QOpenGLWidget的子类)对象;
- 包含
QOffscreenSurface、QOpenGLContext和QOpenGLFramebufferObject指针成员的自定义类以及用于调用OpenGL 函数的QOpenGLFunctions指针执行实际渲染工作,与this link 非常相似。李>
- 如上所述,实际的渲染工作被提取到一个单独的类中,并且两个部分(onscreen和offscreen)都有自己的句柄。
问题:
有两个QOpenGLContexts:
- 在后台线程中进行屏幕外工作时(用于异步渲染),它表示基于
QWindow的QOffscreenSurface不允许存在于gui线程之外; - 在主 (GUI) 线程中执行此操作时,它说
QOpenGLContext无效。
所以我的问题是:
- 我是否应该在同一个 GUI 线程中执行 offscreen 和 onscreen 工作?
- 屏幕外和屏幕部分之间交流和共享资源的最佳方式是什么?
非常感谢一个简短的实际代码示例做一个简单的渲染工作(例如,通过着色语言绘制一个三角形)。
【问题讨论】: