首页 文章

OpenSceneGraph集成到Qt Quick中

提问于
浏览
1

我想将OSG场景集成到我的Qt Quick应用程序中 .

似乎正确的方法是使用 QQuickFramebufferObject 类并在 QQuickFramebufferObject::Renderer::render() 内调用 osgViewer::Viewer::frame() . 我试过用https://bitbucket.org/leon_manukyan/qtquick2osgitem/overview .

但是,似乎这种方法在所有情况下都无法正常工作 . 例如,在Android平台中,此代码仅呈现第一帧 .

我认为问题是 QQuickFramebufferObject 对Qt快速场景图和 QQuickFramebufferObject::Renderer::render() 中调用的代码使用相同的OpenGL上下文 .

所以我想知道,是否有可能使用 QQuickFramebufferObject 正确地将OpenSceneGraph集成到Qt Quick中,或者最好使用 QQuickItem 的实现和单独的OpenGL上下文,如https://github.com/podsvirov/osgqtquick

1 回答

  • 3

    是否可以正确使用QQuickFramebufferObject将OpenSceneGraph集成到Qt Quick中,或者最好使用使用QQuickItem和单独的OpenGL上下文的实现?

    最简单的方法是使用从QQuickItem派生的QQuickPaintedItem . 虽然它默认提供光栅图像类型的绘图,但您可以将其渲染目标切换为OpenGL FramebufferObject

    QPainter使用GL绘制引擎绘制到QOpenGLFramebufferObject中 . 绘画可以更快,因为不需要纹理上传,但抗锯齿质量不如使用图像那么好 . 在某些情况下,此渲染目标允许更快的渲染,但如果经常调整项目大小,则应避免使用它 .

    MyQQuickItem::MyQQuickItem(QQuickItem* parent) : QQuickPaintedItem(parent)
    {
        // unless we set the below the render target would be slow rastering
        // but we can definitely use the GL paint engine just by doing this:
        this->setRenderTarget(QQuickPaintedItem::FramebufferObject);
    }
    

    那么我们如何用这个OpenGL目标渲染呢?答案仍然可以很好旧QPainter填充了更新/ paint上调用的图像:

    void MyQQuickItem::presentImage(const QImage& img)
    {
        m_image = img;
        update();
    }
    
    // must implement
    // virtual void QQuickPaintedItem::paint(QPainter *painter) = 0
    void MyQQuickItem::paint(QPainter* painter)
    {
        // or we can precalculate the required output rect
        painter->drawImage(this->boundingRect(), m_image);
    }
    

    虽然QOpenGLFramebufferObject在幕后使用不是QQuickFramebufferObject它的语义几乎就是问题所在,我们已经向问题作者证实我们可以使用QImage作为源代码在OpenGL中进行渲染 .

    附:自从Qt 5.7在PC桌面和单板触摸屏Linux设备上成功使用这种技术 . 对Android有点不确定 .

相关问题