Вы не привязываете цели к объекту буфера.Цели - это местоположения в контексте OpenGL, с которыми вы можете связать вещи (например, объекты буфера).Таким образом, вы связываете буферные объекты с целями, а не наоборот.
A буферный объект (такого понятия, как VBO, не существует. Есть просто буферные объекты) - это просто неформатированный линейный массив памяти, принадлежащий драйверу OpenGL.Вы можете использовать его в качестве источника данных массива вершин, связав буфер с GL_ARRAY_BUFFER
и вызвав одну из функций gl*Pointer
.Эти функции только работают с буфером, в настоящее время связанным с GL_ARRAY_BUFFER
.Вы можете использовать их в качестве источника данных индекса, связав их с GL_ELEMENT_ARRAY_BUFFER
и вызвав одну из функций glDrawElements
.
Функции, используемые для изменения содержимого объектов буфера (glBufferData
, glMapBuffer
glBufferSubData
и т. Д.) Все они специально выбирают цель для своих операций.Так что glBufferData(GL_ARRAY_BUFFER, ...)
выполняет свою работу с любым буфером, в данный момент связанным с GL_ARRAY_BUFFER
.
Таким образом, существует два вида функций, которые влияют на объекты буфера: те, которые изменяют их содержимое, и те, которые используют их в действии.Последние специфичны для источника;glVertexAttribPointer
всегда использует буфер, в настоящее время связанный с GL_ARRAY_BUFFER
.Вы не можете заставить его использовать другую цель.Аналогично, glReadPixels
всегда использует буфер, связанный с GL_PIXEL_PACK_BUFFER
.И так далее.Если функция работает с объектами буфера, но не принимает цель в качестве параметра, то в документации будет указано, из какой цели она ищет свой буфер.
Примечание: Вершинные массивыдовольно странноАссоциация между атрибутом вершины и буферным объектом осуществляется путем вызова glVertexAttribPointer
.Эта функция устанавливает соответствующие данные для этого атрибута, используя объект буфера, который в настоящее время связан с GL_ARRAY_BUFFER.Под «текущей привязкой» я подразумеваю связанную в то время, когда эта функция называется .Таким образом, сразу после вызова этой функции вы можете вызвать glBindBuffer(GL_ARRAY_BUFFER, 0)
, и она не изменит ничего о том, что происходит, когда вы идете на рендеринг.Он будет отображаться очень хорошо.
Таким образом, вы можете использовать разные буферные объекты для разных атрибутов.Информация будет сохраняться до тех пор, пока вы не измените ее с помощью другого glVertexAttribPointer
вызова для этого конкретного атрибута.