2015-10-27 4 views
3

Я использую старый способ предоставления данных в буфер вершин в OpenGLOpenGL 4, обеспечивающие данные в буфер вершин

glGenBuffers(1, buffer); 
glBindBuffer(GL_ARRAY_BUFFER, buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(pos), pos, GL_STATIC_DRAW); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(1); 

С OpenGL 4.3 есть новый немного более четкий способ предоставления данных вершинного шейдера появляется

const GLfloat colors[] = 
{ 
    1.0f, 0.0f, 0.0f, 
    0.0f, 1.0f, 0.0f, 
    0.0f, 0.0f, 1.0f 
}; 
glBindVertexBuffer(1, buffer, 0, 3 * sizeof(GLfloat)); 

glVertexAttribFormat(1, 3, GL_FLOAT, GL_FALSE, 0); 
glVertexAttribBinding(1, 1); 
glEnableVertexAttribArray(1); 

, но я не могу найти никаких ресурсов, объясняющих, как предоставлять данные по-новому. Конечно, я могу сделать это так:

glBindBuffer(GL_ARRAY_BUFFER, buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); //i can do even so, and later I can use glBindVertexBuffer 

, но это выглядит не очень элегантно. Если я не буду использовать glBindBuffer и только использовать glBindVertexBuffer, а затем использовать glBufferData, я перезапишу данные в буфере, который был связан с помощью glBindBuffer.
Итак, вопрос: могу ли я предоставить данные в буфер вершин другим способом, или я должен всегда использовать glBindBuffer, glBufferData и только после этого использовать glBindVertexBuffer, glVertexBufferFormat, glVertexAttribFormat и glVertexAttribBinding. Спасибо!

ответ

3

Из того, что я могу сказать от OpenGL 4.3 спецификации, вам все равно нужно привязать буфер вершин к «обычной» точки привязки для того, чтобы обновить свои данные:

glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferSubData(GL_ARRAY_BUFFER, offset, size, data); 

Эта проблема фактически была решена в спецификации 4.5 с введением функций DSA, которые позволяют вам обновлять данные буфера без привязки к первому слоту:

glNamedBufferSubData(buffer, offset, size, data); 
4

glVertexAttribFormat и glVertexAttribBinding сообщают OpenGL , как данные организованы в буфер; по существу они заменяют glVertexAttribPointer (и только glVertexAttribPointer). Загрузка данных по-прежнему происходит с данными glBuffer [Sub].

+0

Спасибо за ваш ответ. Но в любом случае для использования glBufferData я должен связать буфер с помощью glBindBuffer раньше или существовать другим способом сообщить OpenGL, что я хочу поместить данные в буфер, который я связываю с помощью glBindVertexBuffer (использование обоих glBindBuffer для размещения данных и glBindVertexBuffer позже кажется немного неоднозначным для меня) ? – nameless323