как VBO присоединяется к VAO
VAO является объектом массива вершин, а VBO - объектом буфера вершин. Призывы к созданию и привязке / отмене привязки VAO и VBO имеют общий формат, как показано ниже:
GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER,
sizeof(GLfloat)* 9,
vertices,
GL_STATIC_DRAW);
glVertexAttribPointer(0,
3, GL_FLOAT, GL_FALSE,
0, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
Я следил за некоторыми учебниками в Интернете, и они говорят, что VBO привязан к VAO, но в приведенном выше коде я не понимаю, как устанавливается "соединение" или "привязка" между VBO и VAO.? Я имею в виду, как мы узнаем, какой VBO связан с каким VAO и что, если VBO должен быть привязан к нескольким VAO?
Итак, основной вопрос: что означает привязка VBO к VAO, как мы узнаем, какой VBO привязан к какому VAO и как устанавливается эта привязка?
1 ответ
как VBO присоединяется к VAO
Он прикрепляется, когда glVertexAttribPointer
называется.
Каждый атрибут, указанный в векторе состояния объектов массива вершин, может относиться к другому объекту буфера вершин. Эта ссылка сохраняется, когда glVertexAttribPointer
называется. Затем буфер, который в настоящее время привязан к целиARRAY_BUFFER
связан с атрибутом, а имя (значение) объекта сохраняется в векторе состояния VAO. ВARRAY_BUFFER
привязка - это глобальное состояние.
Это отличается от индексного буфера (ELEMENT_ARRAY_BUFFER
). Привязка буфера индекса указывается в объекте массива вершин. Когда буфер привязан к целиELEMENT_ARRAY_BUFFER
, то этот буфер связывается с объектом массива вершин, который в данный момент привязан.
Это означает, что когда вы звоните glBindBuffer(GL_ARRAY_BUFFER, VBO);
, то устанавливается глобальное состояние, в котором хранятся VBO
. glVertexAttribPointer
извлекает VBO
из глобального состояния и связывает его с VAO
. когдаglBindBuffer(GL_ARRAY_BUFFER, ...)
вызывается снова, тогда предыдущая привязка теряется, но, конечно, это не меняет никакого состояния VAO.
glBindVertexArray(VAO); # bind VAO (global state)
glBindBuffer(GL_ARRAY_BUFFER, VBO1); # bind VBO1 (global state)
glVertexAttribPointer(0, ...); # associate VBO1 to attribute 0 in VAO
glBindBuffer(GL_ARRAY_BUFFER, VBO2); # bind VBO2 (change global state, VBO1 binding is lost)
glVertexAttribPointer(1, ...); # associate VBO2 to attribute 1 in VAO