通过Qt5 OpenGL框架进行一些屏幕和屏幕外渲染,以便在两个渲染部分之间轻松共享资源。具体地,
QOpenGLWidget
s)中显示,例如不同尺寸,简单起见; QImage
或cv::Mat
对象中; 由于我不知道如何在两个部分之间共享资源,因此在我当前的解决方案中,实际渲染工作在两个部分都是冗余的:
屏幕部分:QMainWindow
(QOpenGLWidget
个)子对象的QOpenGLWidget
个; QOffscreenSurface
,QOpenGLContext
和QOpenGLFramebufferObject
指针成员的自定义类,以及调用OpenGL函数的QOpenGLFunctions
指针执行实际的渲染工作,类似于this link。有两个QOpenGLContext
s:
QWindow
的{{1}}; QOffscreenSurface
无效。所以我的问题是:
执行简单渲染工作的简短实际代码示例(例如,通过着色语言绘制三角形)将非常感激。
答案 0 :(得分:1)
假设QOpenGLContext *main_ctx
是QOpenGLWidget
为实际渲染创建的上下文,您可以在任何线程中创建另一个上下文ctx
并使其与第一个共享纹理和缓冲区:
ctx = std::make_unique<QOpenGLContext>();
ctx->setFormat(main_ctx->format());
ctx->setShareContext(main_ctx);
ctx->create();
我认为QOffscreenSurface
必须基于QWindow
。
offscreen_surface = std::make_unique<QOffscreenSurface>();
offscreen_surface->setFormat(ctx->format());
offscreen_surface->create();
ctx->makeCurrent(offscreen_surface);
然后创建一个QOpenGLFramebufferObject
并从第二个上下文(第二个线程)渲染到它。
然后在主要上下文中使用其纹理:glBindTexture(GL_TEXTURE_2D, fbo->texture());
。这样做时可能需要一些同步。