Можете ли вы использовать несколько целей с одним VBO?

Образец кода:

1. glGenBuffers(1, &VboId);
2. glBindBuffer(GL_ARRAY_BUFFER, VboId);
3. glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
4. glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

Таким образом, мы генерируем общий дескриптор VBO, а затем связываем его, используя "GL_ARRAY_BUFFER". Связывание, кажется, имеет 2 цели:

  1. Мы должны связать буфер, прежде чем мы сможем скопировать данные в графический процессор через glBufferData
  2. Мы должны связать буфер, прежде чем мы сможем добавить атрибуты к нему через glVertexAttribPointer

И я думаю, что это единственный раз, когда вам нужно связать VBO. У меня вопрос, есть ли сценарий, в котором цель (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER или GL_PIXEL_UNPACK_BUFFER) будет отличаться в строках 2 и 3? Или мы хотели бы привязать его к другой цели перед строкой 4?

Можем ли мы связать несколько буферных целей с одним VBO?

1 ответ

Решение

Вы не привязываете цели к объекту буфера. Цели - это местоположения в контексте OpenGL, с которыми вы можете связать вещи (например, объекты буфера). Таким образом, вы привязываете буферные объекты к целям, а не наоборот.

Буферный объект (нет такого понятия, как 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 призыв к этому конкретному атрибуту.

Другие вопросы по тегам