Тибур уже ответил на реальный вопрос, но я подумал, что добавлю некоторый контекст.
glBindBuffer(GL_ARRAY_BUFFER, ...)
само по себе не делает ничего.Думайте об этом как о дополнительном аргументе glVertexAttribPointer
.
Помните, что вы можете привязать несколько буферов к различным атрибутам (скажем, attrib 0 использует vbo 1, а attrib 1 и 2 используют vbo 2).Какой порядок API вы бы увидели для этой установки?
С настоящим API это что-то вроде:
glBindBuffer(GL_ARRAY_BUFFER, 1);
glVertexAttribPointer(0, ...)
glBindBuffer(GL_ARRAY_BUFFER, 2);
glVertexAttribPointer(1, ...)
glVertexAttribPointer(2, ...)
glDraw*(...)
Почему спецификация будет работать таким образом?Ну, это обратная совместимость, поднимая голову.Когда были введены VBO, glVertexPointer
et al.не было никакого параметра для передачи, какой буферный объект использовать.Либо это было много новых точек входа для каждой семантики (VertexPointer / NormalPointer / TexCoordPointer ...), либо это была отдельная дополнительная точка входа, которая просто действовала как дополнительный параметр для вызовов * Pointer.Они выбрали последнее (в качестве примечания, по этой же причине вам нужно передать смещение внутри буфера в качестве указателя).