2017-03-08 3 views
0

私は単純なポイントクラウドデータビューア(学習用)を開発しました。私はQtライブラリを使用しています。私の最初の実装ではQOpenGLWindowを使用しましたが、今はQOpenGLWidgetを使用して動的ライブラリなどを使用したいと考えています。QOpenGLWidgetは最初のペイントで正しく動作します

QOpenGLWidgetに関しては、最初の「ペインティング」(ウィジェットを作成するとPaintGLを呼び出す)だけで動作し、連続するpaintGL()呼び出しで何も起こりません。 この問題はQOpenGLWindowでは表示されず、完全に機能します。

マイPaintGL()私のクラスの次のメソッドを使用してペイント:

:「オブジェクト」は私のapplicacionでのOpenGLのオブジェクトを定義するローカル構造体のSTD ::ベクトルである

void AEOpenGLViewer::renderGL() { 
    // Clear 
    glClear(GL_COLOR_BUFFER_BIT); 

    shader_program->bind(); 

    shader_program->setUniformValue(u_worldToCamera, camera.toMatrix()); 
    shader_program->setUniformValue(u_cameraToView, projection); 
    { 
     for (size_t globjects_index = 0; globjects_index < objects.size(); ++globjects_index) { 
      objects.at(globjects_index).vao->bind(); 
      shader_program->setUniformValue(u_modelToWorld, objects.at(globjects_index).transform.toMatrix()); 

      glDrawArrays(objects.at(globjects_index).primitive_type, 0, objects.at(globjects_index).vertices.size()); 
      objects.at(globjects_index).vao->release(); 
     } 
    } 
    shader_program->release(); 
} 

typedef struct { 
    QOpenGLBuffer *vbo; 
    QOpenGLVertexArrayObject *vao; 
    GLenum primitive_type; 
    std::vector<Vertex> vertices; 
    Transform3D transform; 
} GLObject; 

GPUの負荷を軽減するために、入力イベント(KeyPressEvent、MouseMoveEvent ..)を使用して「update()」というスロットが呼び出されます。

はケースで誰かがVBOは、次のように割り当てられている、興味を持っている:問題が解決される

void AEOpenGLViewer::prepareObjectInGPU(GLObject globject) { 
    shader_program->bind(); 
    { 
     // Create Buffer (Do not release until VAO is created) (vbo) 
     globject.vbo->create(); 
     globject.vbo->bind(); 
     globject.vbo->setUsagePattern(QOpenGLBuffer::StaticDraw); 
     globject.vbo->allocate(globject.vertices.data(), globject.vertices.size() * sizeof(Vertex)); 

     // Create Vertex Array Object (vao) 
     globject.vao->create(); 
     globject.vao->bind(); 

     shader_program->enableAttributeArray(0); 
     shader_program->enableAttributeArray(1); 
     shader_program->setAttributeBuffer(0, GL_FLOAT, Vertex::positionOffset(), Vertex::PositionTupleSize, Vertex::stride()); 
     shader_program->setAttributeBuffer(1, GL_FLOAT, Vertex::colorOffset(), Vertex::ColorTupleSize, Vertex::stride()); 

     // Release (unbind) all 
     globject.vbo->release(); 
     globject.vao->release(); 
    } 
    shader_program->release(); 
} 

答えて

0

、それは起こった私は(GPU内のオブジェクトの割り当て時に対応するコンテキスト電流をしなければならないので、私のprepareObjectInGPU()メソッド)。だから、問題は次のように解決される。

void AEOpenGLViewer::prepareObjectInGPU(GLObject globject) { 
    makeCurrent(); 
    shader_program->bind(); 
    { 
     ... 
    } 
    shader_program->release(); 
    doneCurrent(); 
} 

をQOpenGLWindowでは、それが必要ではなかったが、私はそれのように良いプラクティス行うことをお勧めします。 PaintGL()の間に、paintGL()を呼び出す前に自動的に呼び出されるため、makeCurrent()を呼び出す必要はありません。

しかし、もし誰かが私に答えたいなら、あなたは大歓迎です。

ありがとうございます!

関連する問題