2012-11-28 13 views
13

Sto cercando un modo per rendere le mie chiamate opengl personalizzate all'interno di un elemento qtquick 2.0. Per darti un po 'di contesto: ho un motore C++ 3d che usa opengl per il rendering. L'obiettivo è quello di renderlo all'interno di un'interfaccia utente qtquick 2.0.Rendering opengl personalizzato in qt5's qtquick 2.0

Quello che ho scoperto è che pre qt 5.0 (qtquick 2.0) si utilizza un QtGlWidget e lo si incorpora in QDeclarativeView. Un altro modo che ho trovato sarebbe quello di utilizzare un oggetto QtDeclarativeItem e sovrascrivere il metodo void QDeclarativeItem :: paint (QPainter * p, const QStyleOptionGraphicsItem * o, QWidget * w).

Come ho capito, questo non è più possibile in quanto QtQuick 2.0 utilizza un nuovo renderer basato su OpenGl. È quindi come non sembra facile come ignorare un metodo di pittura.

Qualcuno sa come andrei sull'implementazione di un QQuickItem che consente il rendering delle mie chiamate opengl?

risposta

3

Nel motore 3D, eseguire il rendering in una trama e nel proprio QQuickItem utilizzare QSGSimpleTextureNode per mostrare i risultati del rendering. QtQuick mantiene il proprio stato GL, che altrimenti potrebbe rovinarsi, è per questo che si consiglia di utilizzare solo le classi QSG * per mostrare contenuti personalizzati. In sostanza, QtQuick semplice è uno strumento per il rendering di rettangoli, non di contenuti 3D in genere.

(Lame) Esempio:

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

È inoltre necessario creare un'istanza di un timer per aggiornare il contenuto. Puoi farlo all'interno di QQuickItem.

8

Si può fare una delle due cose. O rendere il contenuto in una texture o renderizzare nel contesto OpenGL del grafico di scena agganciando utilizzando i segnali QQuickWindow::beforeRendering o QQuickWindow::afterRendering.

Un esempio su come utilizzare FBO e consistenza può essere trovato qui: http://doc.qt.io/qt-5/qtquick-scenegraph-textureinsgnode-example.html

Un esempio di come rendere direttamente al contesto OpenGL del grafico scena può essere trovato qui: http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html

+0

OSA (per Qt 5.2): http://qt.apidoc.info/5.2.0/qtquick/qtquick-scenegraph-textureinsgnode-example.html Grafico scena - OpenGL Sotto QML (per Qt 5): http: // qt-project. org/doc/qt-5/QtQuick-scenegraph-openglunderqml-example.html – troyane