更新顶点并将其发送到GPU的正确方法是什么?

时间:2015-03-25 01:54:08

标签: qt opengl graphics

我正在尝试使用来自用户点击QOpenGLWidget的点来绘制线条。如果我手动放置顶点并且不更新它们,它会按预期工作,但如果我更新我的Vertex矢量,它只会从窗口中心到右边中心绘制一条线,而不管顶点位置如何。这是我的updateVertices方法(当用户点击小部件时调用):

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

1 个答案:

答案 0 :(得分:0)

我明白了。而不是&vertices.begin()我必须使用&vertices.front()