2012-11-28 11 views
13

Özel opengl çağrılarımı qtquick 2.0 öğesinde render etmenin bir yolunu arıyorum. Biraz bağlam vermek için: render için opengl kullanan bir C++ 3d motoru var. Amaç, bir qtquick 2.0 UI içinde render etmektir.qt5'in qtquick 2.0 sürümünde özel opengl oluşturma

Bulduğum şey, bir qtGlWidget'i kullanmanız ve bunu QDeclarativeView içine yerleştirmenizden önce qtquick 2.0 öncesi (qtquick 2.0) olmasıdır. Bulduğum başka bir yol QtDeclarativeItem kullanmak ve geçersiz QDeclarativeItem :: paint (QPainter * p, const QStyleOptionGraphicsItem * o, QWidget * w) yöntemini geçersiz kılmak olacaktır.

Anladığım kadarıyla, bu QtQuick 2.0 OpenGl tabanlı yeni bir oluşturucu kullandığı için artık bu mümkün değil. Bu nedenle bir boya yöntemini geçersiz kılmak kadar kolay değildir.

Opengl çağrılarımın oluşturulmasına izin veren bir QQuickItem uygulamasını nasıl uygulayacağımı bilen var mı?

cevap

3

3B motorunuzda, bir doku haline getirin ve render sonuçlarının gösterilmesi için QQuickItemQSGSimpleTextureNode kullanın. QtQuick, aksi takdirde bozulabilen kendi GL durumunu korur, bu yüzden özel içeriği göstermek için yalnızca QSG * sınıflarını kullanmanız önerilir. Temel olarak, sade QtQuick genel olarak 3B içeriği değil, dikdörtgenleri oluşturmak için bir araçtır.

(Lame) örnek:

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

Ayrıca içeriğini güncellemek için bir Timer örneğini gerekir. Bunu QQuickItem içinden yapabilirsiniz.

8

İki şeyden birini yapabilirsiniz. İçeriğinizi bir dokuya dönüştürün veya sahne grafiğinin OpenGL bağlamında QQuickWindow::beforeRendering veya QQuickWindow::afterRendering sinyallerini kullanarak işleyin.

FBO ve doku kullanımı ile ilgili bir örnek burada bulunabilir: http://doc.qt.io/qt-5/qtquick-scenegraph-textureinsgnode-example.html

sahne grafiğinin OpenGL içeriğine doğrudan oluşturmak için nasıl bir örnek burada bulunabilir: http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html

+0

FBO (için Qt 5.2): http://qt.apidoc.info/5.2.0/qtquick/qtquick-scenegraph-textureinsgnode-example.html Sahne Grafiği - QML Altında OpenGL (Qt 5 için): http: // qt-project. org/doc/qt-5/qtquick-skenograf-openglunderqml-example.html – troyane