Вы не «заменяете» glBindBuffer
; Вы просто не используете это. В этом весь смысл DSA: не нужно связывать объекты просто для изменения их.
glGetAttribLocation
уже является функцией DSA (первым параметром является объект, на который она действует), поэтому вы продолжаете использовать его (или, что еще лучше, прекратите задавать шейдер и назначить position
конкретное местоположение в шейдер ).
Все функции glVertexArray*
управляют VAO, прикрепляя буферы и определяя форматы вершин. Проблема, с которой вы столкнулись, заключается в том, что вы привыкли к ужасному glVertexAttribPointer
API, который был заменен на гораздо лучший API в 4.3 . А DSA не предоставляет DSA-версию ужасного старого API. Поэтому вам нужно использовать отдельный API формата атрибута в форме DSA.
Эквивалентом того, что вы пытаетесь сделать, будет:
glCreateVertexArrays(1, &phong.vao);
//Setup vertex format.
auto positionAttribute = glGetAttribLocation(phong.program, "position");
glEnableVertexArrayAttrib(phong.vao, positionAttribute);
glVertexArrayAttribFormat(phong.vao, positionAttribute, 3, GL_FLOAT, GL_FALSE, 0);
glVertexArrayAttribBinding(phong.vao, positionAttribute, 0);
//Attach a buffer to be read from.
//0 is the *binding index*, not the attribute index.
glVertexArrayVertexBuffer(phong.vao, 0, phong.vbo, 0, sizeof(GLfloat) * 6);
//Index buffer
glVertexArrayElementBuffer(phong.vao, phong.ebo);