[osg-users] QtQuickFrameBufferObject and GraphicsContexts

Konstantin Podsvirov konstantin at podsvirov.pro
Tue Aug 22 12:20:47 PDT 2017


Hello Antoine!

22.08.2017, 19:51, "Antoine Rennuit" <antoinerennuit at hotmail.com>:
> Hi all
>
> I have integrated OSG within QQuick 2 via QtQuickFramebufferObject, it is working great with complex scenes and within a complex application behind the hood, except for 1 point: I sometimes observe flickering of the whole window (it is not only the 3d view that flickers but the whole application window - check the video here (https://youtu.be/NlAxvTAVpl0)). It is not periodic, only every now and then, it can get crazy for a few seconds and then calms down.
>
> In QtQuick the windowing system is actually rendered in OpenGL (hence the complexity). QtQuickFramebufferObject provides you with the tools to design a custom 3d item, and is thus the preferred way to implement a 3d view.
>
> QtQuickFramebufferObject has you define a renderer and create a Qt compatible GL framebuffer in a function called by the QtQuick framework
>
> Code:
> QOpenGLFramebufferObject* OsgRenderer::createFramebufferObject(const QSize &size)
> {
>     QOpenGLFramebufferObjectFormat format;
>     format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
>     return new QOpenGLFramebufferObject(size, format);
> }
>
> it then has you write a render function also called by the QtQuick 2 framework, this is where I call my OSG rendering
>
> Code:
>
> void OsgRenderer::render()
> {
>     assert(m_osgItem);
>
>     if ( !m_osgItem->getViewer() )
>         return;
>
>     // Without this line the model is not displayed in the second
>     // and subsequent frames.
>     QOpenGLContext::currentContext()->functions()->glUseProgram(0);
>
>     // Ask OSG to render.
>     m_osgItem->getViewer()->frame(); // WARNING: non-blocking (executed in a thread of its own - in a thread-safe way).
>
>     // Reset OpenGl state for QtQuick.
>     m_osgItem->window()->resetOpenGLState();
> }
>
> The QtQuick framework then merges the framebuffer in which I rendered with its own rendering to display the final image.
>
> Now I suspect my flickering issue comes from a problem of GL context mix-up between QtQuick and OSG.
>
> So I have inherited osgViewer::GraphicsWindowEmbedded to use as custom GraphicsContext which binds and releases the framebuffer created above:
>
> Code:
>
> bool OsgWindow::makeCurrentImplementation()
> {
>     if (!m_renderer)
>         return false;
>
>     if (!m_renderer->framebufferObject())
>         return false;
>
>     return m_renderer->framebufferObject()->bind();
> }
>
> bool OsgWindow::releaseContextImplementation()
> {
>     if (!m_renderer)
>         return false;
>
>     if (!m_renderer->framebufferObject())
>         return false;
>
>     return m_renderer->framebufferObject()->release();
> }
>
> Does that ensure me that the OSG rendering in frame() is written to this FBO?
>
> Also as far as I know, the GL context is kept in OsgWindow (it inherits osgViewer::GraphicsWindowEmbedded as stated above), but is it reapplied at each frame? i.e. the GL context is modified by QtQuick's own GL rendering but am I sure that it is put back in place for OSG's correct rendering when I call frame()? If not, is there a way for me to enforce OSG's GL context is not modified by QtQuick?
>
> Thanks a lot,
>
> Antoine
>
> ------------------
> Read this topic online here:
> http://forum.openscenegraph.org/viewtopic.php?p=71500#71500
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Please review source code of the other similar projects:

a) osgQtQuick

https://github.com/podsvirov/osgqtquick

b) qmlosg

https://github.com/rickyviking/qmlosg

c) QtQuick2OSGItem

https://bitbucket.org/leon_manukyan/qtquick2osgitem

Perhaps you will find answers to your questions or help develop another project.

--
Regards,
Konstantin Podsvirov - osgQtQuick author


More information about the osg-users mailing list