Qtquick2 QQuick&x2B;明景照片闪烁

Qtquick2 QQuick&x2B;明景照片闪烁,qtquick2,openscenegraph,qtquickcontrols2,Qtquick2,Openscenegraph,Qtquickcontrols2,我正在使用QQuickControls 2(SwipeView)和OpenSceneGraph进行3d渲染。使用QQuickFramebufferObject进行集成 由于我引入了SwipeView,我观察到我的GUI有些闪烁 我在文档中查找了好几年了(大概是几周),完全不知道为什么会出现这种闪烁 (闪烁开始于约20秒) 这是我的渲染代码: class OsgRenderer : public QQuickFramebufferObject::Renderer { public: exp

我正在使用QQuickControls 2(SwipeView)和OpenSceneGraph进行3d渲染。使用QQuickFramebufferObject进行集成

由于我引入了SwipeView,我观察到我的GUI有些闪烁

我在文档中查找了好几年了(大概是几周),完全不知道为什么会出现这种闪烁

(闪烁开始于约20秒)

这是我的渲染代码:

class OsgRenderer : public QQuickFramebufferObject::Renderer
{
public:
    explicit OsgRenderer();

    QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) LC_OVERRIDE;
    void synchronize(QQuickFramebufferObject* item) LC_OVERRIDE;
    void render() LC_OVERRIDE;

protected:
    friend class OsgWindow;

    OsgItem* m_osgItem;
};

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();
}

知道从哪里来吗?

一般来说,让QtQuick和OSG都渲染到同一OpenGL上下文不是一个好主意。
OSG它在帧之间内部保持其GL状态,但Qt可能在不通知OSG的情况下从“外部”修改它,这可能会导致渲染问题。
更可靠的方法是让他们使用单独(和共享)的GL上下文,并将fbo osg Redner的上下文复制到Qt使用的纹理中。
我在这里成功地实施了这种方法: 但尚未使用最新版本的QtQuick对其进行测试。

在这里可以找到更为最新的集成:

您是否通过在QQuickFrameBufferObject中调用
update
来使用计时器频繁更新场景?我猜闪烁的原因可能是因为Qt Quick自动降低了背景项的更新频率。@Jimmy:我确实调用了QQuickFramebufferObject::update()(但从QQuickFramebufferObject外部调用,而不是从内部调用-不确定这会有多大不同)。我不确定我是否理解你提到的更新频率差异,这对我有何影响,以及我能做些什么。有什么想法吗?QQuickFramebufferObject实际上让您渲染到一个单独的FBO中,该FBO由渲染器本身创建。我相信QQuickFramebufferObject实际上在2013年编写代码时并不存在,尽管我相信您的评论是相关的。实际上我有。@arennuit您是对的,QQuickFramebufferObject在2013年不存在,但从我所看到的来看,它主要是一个容器类,用于执行渲染指令。关于GL上下文的所有问题仍然有效,您应该调整实现,使其与这个新类一起工作