2017-03-08 104 views
0

我開發了一個簡單的點雲數據查看器(僅用於學習),我正在使用Qt庫。我的第一個實現使用QOpenGLWindow,但現在我想使用QOpenGLWidget來使用它,例如動態庫。QOpenGLWidget只能在第一個油漆中正常工作

關於QOpenGLWidget,它只是在第一個「繪畫」(在創建窗口小部件時調用PaintGL)以及在連續的paintGL()調用中沒有任何反應。 這個問題不會出現在QOpenGLWindow中,它完美的工作。

我PaintGL()油漆使用我的課的下一個方法:

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

其中「對象」是一個局部結構,在我的applicacion定義OpenGL的物體的一個std ::向量:

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()期間,調用makeCurrent()是沒有必要的,因爲它在調用paintGL()之前被自動調用。

但是,如果有人想回答我,那麼歡迎您。

謝謝!