将QWidget渲染到FBO

时间:2017-12-12 10:40:49

标签: qt opengl widget fbo

我在Qt编写VR应用程序,需要在桌面和VR内部显示QWidget。

到目前为止,我正在渲染:

form

这是从主QOpenGLWidget的paintGL()调用的。

在Vr中,此纹理用于四边形。 到目前为止,只有文本被渲染。如果将QPixmap用作设备,则窗口小部件呈现正常。

My Widget非常复杂,有4k行代码用于所有旋转框,标签之间的连接...

Widget look

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,也许不是最好的解决方案。

Overlay需要自己的上下文,所以在init:

overlayGLcontext = new QOpenGLContext();
overlayGLcontext->setFormat( format );
overlayGLcontext->setShareContext(widgetGLcontext);
overlayGLcontext->create();

offscreen_surface = new QOffscreenSurface();
offscreen_surface->create();

...

overlayGLcontext->makeCurrent(offscreen_surface);
fbo = new QOpenGLFramebufferObject( w12, h12, GL_TEXTURE_2D);

...

overlayGLcontext->makeCurrent(offscreen_surface);
fbo->bind();

QOpenGLPaintDevice device(QSize(w12,h12));
QPainter painter(&device);

painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

painter.beginNativePainting();

gl_functions->glClearColor(0.0, 0.0, 0.0, 0.0);
gl_functions->glClear(GL_COLOR_BUFFER_BIT);

painter.endNativePainting();

widget1->render(&painter);
widget2->render(&painter,QPoint(widget1->width(),0),QRegion());

painter.end();

fbo->release();

texture = fbo->texture();