2012-11-28 30 views
13

में कस्टम opengl प्रस्तुत करना मैं एक qtquick 2.0 आइटम के अंदर अपनी कस्टम opengl कॉल प्रस्तुत करने का एक तरीका ढूंढ रहा हूं। आपको कुछ संदर्भ देने के लिए: मेरे पास एक सी ++ 3 डी इंजन है जो प्रतिपादन के लिए ओपनजीएल का उपयोग करता है। लक्ष्य यह एक qtquick 2.0 UI के अंदर प्रतिपादन करना है।qt5 के qtquick 2.0

मुझे पता चला कि प्री क्यूटी 5.0 (qtquick 2.0) आप एक QtGlWidget का उपयोग करेंगे और QDeclarativeView में एम्बेड करेंगे। एक और तरीका मैंने पाया कि एक QtDeclarativeItem का उपयोग करना होगा और शून्य QDeclarativeItem :: पेंट (QPainter * p, const QStyleOptionGraphicsItem * o, QWidget * w) विधि को ओवरराइड करना होगा।

जैसा कि मैं समझता हूं कि यह अब संभव नहीं है क्योंकि QtQuick 2.0 ओपनजीएल पर आधारित एक नया रेंडरर का उपयोग करता है। ऐसा इसलिए है क्योंकि यह एक पेंट विधि को ओवरराइड करने जितना आसान नहीं लगता है।

क्या कोई जानता है कि मैं QQuickItem को लागू करने के बारे में कैसे जाऊंगा जो मेरी ओपनजीएल कॉल को प्रस्तुत करने की अनुमति देता है?

उत्तर

3

अपने 3 डी इंजन में, एक बनावट में प्रस्तुत करें और QQuickItem में QSGSimpleTextureNode का उपयोग प्रतिपादन परिणाम दिखाने के लिए करें। QtQuick अपने स्वयं के जीएल राज्य को बनाए रखता है, जिसे आप अन्यथा गड़बड़ कर सकते हैं, यही कारण है कि कस्टम सामग्री दिखाने के लिए केवल QSG * कक्षाओं का उपयोग करने की अनुशंसा की जाती है। असल में, सादा QtQuick आयत प्रतिपादन के लिए एक उपकरण है, आमतौर पर 3 डी सामग्री नहीं।

(लेम) उदाहरण:

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::beforeRendering या QQuickWindow::afterRendering सिग्नल का उपयोग करके हुकिंग करके दृश्य ग्राफ़ के ओपनजीएल संदर्भ में अपनी सामग्री को बनावट में प्रस्तुत करें या प्रस्तुत करें।

कैसे FBO और बनावट का उपयोग करने पर एक उदाहरण यहां पाया जा सकता: के लिए http://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html

+0

FBO (: http://doc.qt.io/qt-5/qtquick-scenegraph-textureinsgnode-example.html

कैसे सीधे दृश्य ग्राफ के ओपन संदर्भ के लिए प्रस्तुत करने के लिए पर एक उदाहरण यहां पाया जा सकता क्यूटी 5.2): http://qt.apidoc.info/5.2.0/qtquick/qtquick-scenegraph-textureinsgnode-example.html दृश्य ग्राफ - क्यूएमएल के तहत ओपनजीएल (क्यूटी 5 के लिए): http: // qt-project। org/doc/क्यूटी -5/qtquick-scenegraph-openglunderqml-example.html – troyane