2012-11-28 124 views
13

我正在尋找一種方法在qtquick 2.0項目中渲染自定義opengl調用。給你一些上下文:我有一個使用opengl進行渲染的C++ 3d引擎。目標是讓它在qtquick 2.0 UI中呈現。在qtquick 2.0中渲染自定義opengl

我發現,pre qt 5.0(qtquick 2.0)你會使用QtGlWidget並將其嵌入到QDeclarativeView中。我發現的另一種方法是使用QtDeclarativeItem並覆蓋void QDeclarativeItem :: paint(QPainter * p,const QStyleOptionGraphicsItem * o,QWidget * w)方法。

據我所知,這是不可能的,因爲QtQuick 2.0使用基於OpenGl的新渲染器。因此,它似乎不像覆蓋塗料方法那麼容易。

有沒有人知道我會如何去實現一個允許渲染我的opengl調用的QQuickItem?

回答

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中做到這一點。

8

你可以做兩件事之一。通過使用QQuickWindow::beforeRenderingQQuickWindow::afterRendering信號掛鉤,將場景內容渲染到場景圖形的OpenGL上下文中的紋理或渲染。

如何使用FBO和紋理的例子可以在這裏找到:http://doc.qt.io/qt-5/qtquick-scenegraph-textureinsgnode-example.html

有關如何直接渲染到場景圖的OpenGL上下文的例子可以在這裏找到:http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html

+0

FBO(用於Qt 5.2):http://qt.apidoc.info/5.2.0/qtquick/qtquick-scenegraph-textureinsgnode-example.html 場景圖形--QML下的OpenGL(用於Qt 5):http:// qt-project。組織/ DOC/QT-5/qtquick-場景圖-openglunderqml-example.html的 – troyane