2015-11-09 5 views
4

Когда я первый добавить несколько вершин в буфер, это соответствующие функции я звонюOpenGL обновления вершин массива/буфер

// Create and bind the object's Vertex Array Object: 
    glGenVertexArrays(1, &_vao); 
    glBindVertexArray(_vao); 

    // Create and load vertex data into a Vertex Buffer Object: 
    glGenBuffers(1, &_vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, _vbo); 
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), &vertices[0], GL_STATIC_DRAW); 

    // Tells OpenGL that there is vertex data in this buffer object and what form that vertex data takes: 

    // Obtain attribute handles: 
    _posAttrib = glGetAttribLocation(program, "position"); 
    glEnableVertexAttribArray(_posAttrib); 
    glVertexAttribPointer(_posAttrib, // attribute handle 
          4,   // number of scalars per vertex 
          GL_FLOAT, // scalar type 
          GL_FALSE, 
          0, 
          0); 

    // Unbind vertex array: 
    glBindVertexArray(0); 

Но потом в моей программе, я хочу добавить еще несколько вершин.

Я делаю это по следующим (в виде отдельной функции:

add_vertices(x,y); //adds the necessary vertices to the vector. 
glGenBuffers(1, &_vbo); 
glBindBuffer(GL_ARRAY_BUFFER, _vbo); 
glBufferData(GL_ARRAY_BUFFER, (TRIANGLE_AMOUNT+1)*4*_number_of_circles * sizeof(float), &vertices[0], GL_STATIC_DRAW); 

Предполагая, что фанк размер во 2-й аргумент glBufferData будет хорошо, я не хватает что-нибудь Есть ли другие OpenGL функции, которые требуют вызова ?

Я не получаю никаких ошибок, но когда я пытаюсь нарисовать дополнительные фигуры с новыми вершинами, перейдя через glDrawArrays с разными подмножествами вершин, ничего не происходит. Только первая фигура нарисована.

I надеюсь, что это полукогерентный ... дайте мне знать, если есть какая-либо информация, которую я не предоставил.

Cheers.

+0

Если вы просто хотите заменить данные в буфере, вы не должны генерировать новый. 'glBindBuffer' +' glBufferData' является достаточным в этом случае. Когда вы снова вызываете glGenBuffers, вы получаете совершенно новый буфер, а это значит, что вам нужно будет обновить vao. – BDL

+0

Ахх, это определенно прогресс. Сейчас он рисует новый материал ... но они просто случаются как капли, а не круги. Спасибо друг! –

ответ

1

В OpenGL, изменения буферов и обмена буферов данных две разные вещи, которые требуют различных действий, которые следует предпринять после:

обмене данными

В этом случае требуется предварительно генерироваться ВБО , Для того, чтобы загрузить новые данные, то требуется только связать буфер и буфер новые данные:

glBindBuffer(GL_ARRAY_BUFFER, _vbo); 
glBufferData(GL_ARRAY_BUFFER, (TRIANGLE_AMOUNT+1)*4*_number_of_circles * sizeof(float), 
    &vertices[0], GL_STATIC_DRAW); 

Создание нового буфера

В этом случае новый буфер генерируется glGenerateBuffers и (в дополнение для загрузки данных) все привязки VAO должны быть обновлены.

Sidenote: В приведенном выше коде вы создаете новый буфер без удаления предыдущего буфера.