2017-07-16 12 views
0

MathGLでデータをプロットするために、QMLアプリケーション内にカスタムOpenGLウィジェットをプログラミングしたかったのです。
シーングラフの例をhttp://doc.qt.io/qt-5/qtquick-scenegraph-openglunderqml-example.html
にしました。次に、コードを自分のニーズに適合させ、問題が発生しました。画像は1つのレンダリングを点滅させ、その後はもう表示されません。 以下は重要な機能とバインディングです。QOpenGLFunctionsのレンダリング問題

クラスGLRenderEngine:公共QObjectを、公共QOpenGLFunctions

void GLRenderEngine::render() 
{ 
    if(!m_bInit) 
    { 
     initializeOpenGLFunctions(); 
     m_pGraph = new mglGraph(1); 
     m_bInit = true; 
    } 
    glViewport(m_Viewport.left(), m_Viewport.top(), m_Viewport.width(), m_Viewport.height()); 
    m_pGraph->Clf(); 
    //Graph stuff ... 
    m_pGraph->Finish(); 
    if(m_pWindow) 
     m_pWindow->resetOpenGLState(); 
} 


クラスGLWidget:私が使用したときに、公開QQuickItem

GLWidget::GLWidget(QQuickItem *parent) : QQuickItem(parent) 
{ 
    m_pRender = 0; 
    connect(this, &QQuickItem::windowChanged, this, &GLWidget::handleWindowChanged); 
} 

void GLWidget::handleWindowChanged(QQuickWindow *win) 
{ 
    if(win) 
    { 
     connect(win, &QQuickWindow::beforeSynchronizing, this, &GLWidget::sync, Qt::DirectConnection); 
     connect(win, &QQuickWindow::sceneGraphInvalidated, this, &GLWidget::cleanup, Qt::DirectConnection); 
     win->setClearBeforeRendering(false); 
    } 
} 

void GLWidget::cleanup() 
{ 
    if(m_pRender) 
    { 
     delete m_pRender; 
     m_pRender = 0; 
    } 
} 

void GLWidget::sync() 
{ 
    if(!m_pRender) 
    { 
     m_pRender = new GLRenderEngine(); 
     connect(window(), &QQuickWindow::beforeRendering, m_pRender, &GLRenderEngine::render, Qt::DirectConnection); 
    } 
    m_pRender->setViewportSize(boundingRect()); 
    m_pRender->setWindow(window()); 
} 

QML-ファイルは

import QtQuick 2.8 
import QtQuick.Window 2.2 
import GLWidget 1.0 

Window { 
    visible: true 
    width: 320 
    height: 480 

    GLWidget{ 
     anchors.fill: parent 
     id: glView 
    } 

    Rectangle { 
     color: Qt.rgba(1, 1, 1, 0.7) 
     radius: 10 
     border.width: 1 
     border.color: "white" 
     anchors.fill: label 
     anchors.margins: -10 
    } 

    Text { 
     id: label 
     color: "black" 
     wrapMode: Text.WordWrap 
     text: "The background here is a squircle rendered with raw OpenGL using the 'beforeRender()' signal in QQuickWindow. This text label and its border is rendered using QML" 
     anchors.right: parent.right 
     anchors.left: parent.left 
     anchors.bottom: parent.bottom 
     anchors.margins: 20 
    } 
} 

私はまた、気づきましたQQuickFramebufferObjectイメージのディスカードupdate()やウィンドウのサイズ変更イベントが呼び出された後で、レンダリング関数が呼び出されているにもかかわらず、バッファが更新されていないか、qtがオフになっていると思われます。
ご協力いただきありがとうございます。

答えて

0

この問題を解決するために、私はQQuickFrameBuffer実装に切り替え、レンダリング関数内で使用していたglClearコマンドをすべて削除しました。一方、ベースクラスQQuickItemのクリアフラグは有効です。 これは今の魅力のように機能します。

関連する問題