2012-11-28 10 views
13

qtquick 2.0 항목 내에서 사용자 정의 OpenGL 호출을 렌더링하는 방법을 찾고 있습니다. 컨텍스트를 제공하려면 : 나는 OpenGL을 렌더링에 사용하는 C++ 3d 엔진을 가지고 있습니다. 목표는 qtquick 2.0 UI 내부에서 렌더링되도록하는 것입니다.qt5의 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 엔진에서 텍스처에 렌더링하고 QQuickItemQSGSimpleTextureNode을 사용하여 렌더링 결과를 표시합니다. 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::beforeRendering 또는 QQuickWindow::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 (Qt 5)의 OpenGL : http : // qt-project. org/doc/qt-5/qtquick-scenegraph-openglunderqml-example.html – troyane