2015-03-25 34 views
0

我試圖用用戶點擊一個QOpenGLWidget繪製一個線條。如果我手動放置頂點並且不更新它們,它會按預期工作,但是如果我更新了我的Vertex矢量,則它只會繪製從中心到小部件右側中心的一條線,而不管頂點位置如何。這是我的updateVertices方法(當用戶點擊該小部件的稱呼):什麼是更新頂點並將其發送到GPU的正確方法?

void CurveGLWidget::updateVertices() 
{ 
    m_vao.bind(); 
    m_vbo.bind(); 

    m_vbo.allocate(vertices.size() * sizeof(Vertex)); 
    m_vbo.write(0, &vertices.begin(), vertices.size() * sizeof(Vertex)); 

    m_program.enableAttributeArray("position"); 
    m_program.setAttributeBuffer("position", GL_FLOAT, 0, 2, sizeof(Vertex)); 

    m_program.enableAttributeArray("color"); 
    m_program.setAttributeBuffer("color", GL_FLOAT, sizeof(glm::vec2), 4, sizeof(Vertex)); 

    m_vao.release(); 
    m_vbo.release(); 
} 

在這一點上m_vao和m_vbo已創建。

這是我paintGL方法:

void CurveGLWidget::paintGL() 
{ 
    if (vertices.size() < 2) { 
     return; 
    } 
    updateVertices(); 
    glClearColor(m_clearColor.r, m_clearColor.g, m_clearColor.b, m_clearColor.a); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
    m_program.bind(); 
    m_vao.bind(); 
    glDrawArrays(GL_LINE_STRIP, 0, vertices.size()); 
    m_vao.release(); 
    m_program.release(); 
} 

這是用戶點擊的樣本:

V    X  Y 
Vertex[ 0 ] = [ -0.715, 0.48 ] 
Vertex[ 1 ] = [ -0.5175, 0.08 ] 
Vertex[ 2 ] = [ -0.285, 0.426667 ] 
Vertex[ 3 ] = [ -0.2, -0.153333 ] 
Vertex[ 4 ] = [ -0.02, 0.64 ] 
Vertex[ 5 ] = [ 0.1425, 0.05 ] 
Vertex[ 6 ] = [ 0.2875, 0.696667 ] 
Vertex[ 7 ] = [ 0.41, 0.03 ] 
Vertex[ 8 ] = [ -0.485, -0.396667 ] 
Vertex[ 9 ] = [ -0.015, -0.37 ] 
Vertex[ 10 ] = [ 0.14, 0.316667 ] 

誰能告訴我什麼是錯的代碼?我如何根據需要更新頂點?可以找到完整的CurveGLWidget源代碼here

回答

0

我想通了。我必須使用&vertices.front()而不是&vertices.begin()

相關問題