在Qt5的QtQuick 2.0中渲染自定义OpenGL

14

我正在寻找一种方法在qtquick 2.0项内渲染我的自定义opengl调用。为了给你一些背景: 我有一个C++ 3d引擎,使用opengl进行渲染。目标是使其在qtquick 2.0 UI内渲染。

我发现,在qt 5.0之前(qtquick 2.0),您可以使用QtGlWidget并将其嵌入QDeclarativeView中。另一种方法是使用QtDeclarativeItem并覆盖void QDeclarativeItem::paint(QPainter *p, const QStyleOptionGraphicsItem *o, QWidget *w)方法。

据我所知,这已不再可能,因为QtQuick 2.0使用基于OpenGl的新渲染器。因此,它似乎不像覆盖paint方法那样容易。

是否有人知道如何实现允许渲染我的opengl调用的QQuickItem?

2个回答

8

FBO(适用于Qt 5.2):http://qt.apidoc.info/5.2.0/qtquick/qtquick-scenegraph-textureinsgnode-example.html 场景图-在QML下使用OpenGL(适用于Qt 5):http://qt-project.org/doc/qt-5/qtquick-scenegraph-openglunderqml-example.html - tro

3
在你的3D引擎中,渲染到纹理中,在你的QQuickItem中使用QSGSimpleTextureNode来显示渲染结果。QtQuick维护着它自己的GL状态,否则你可能会搞砸它,这就是为什么建议只使用QSG*类来显示自定义内容。基本上说,普通的QtQuick是一个用于渲染矩形的工具,而不是3D内容。
(无聊的)例子:
QScopedPointer<QSGTexture> texture_;

QSGNode* MyItem::updatePaintNode(QSGNode* node, UpdatePaintNodeData*)
{
  if (width() <= 0 || height() <= 0)
  {
    texture_.reset();

    delete node;
    return 0;
  }
  else
  {
    if (!node)
    {
      node = new QSGSimpleTextureNode;

      static_cast<QSGSimpleTextureNode*>(node)
        ->setFiltering(QSGTexture::Nearest);
    }
    // else do nothing

    static_cast<QSGSimpleTextureNode*>(node)->setRect(boundingRect());

    getTheTextureFrom3DEngine(texture_);

    Q_ASSERT(texture_);
    static_cast<QSGSimpleTextureNode*>(node)->setTexture(texture_.data());

    return node;
  }
}

您还需要实例化一个计时器来更新内容。可以在QQuickItem内部执行此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接