Во всех руководствах, которые я могу найти о VAO (объектах Vertex Array), они показывают, как их использовать, настраивая атрибуты вершин и связывая VBO (объект буфера вершин). Но я хочу создать VAO, который будет настроен для набора VBO в сочетании с фиксированным шейдером, где каждый буфер использует один и тот же шаблон данных (вершина, uv, цвет и т. Д.). Итак, я хочу создать один VAO для нескольких VBO, которые будут рисоваться с использованием одного шейдера.
Я не смог найти никакой демонстрации по этому поводу, поэтому я решил просто попробовать. Но это не работает и вылетает при glDrawArray
вызове. Похоже, VBO не связан. Вот код, который я использую:
Оказание:
/* Prepare vertex attributes */
glBindVertexArrayOES(vao);
/* Upload the buffer to the GPU */
glBindBuffer(GL_ARRAY_BUFFER, pool->next());
glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer());
/* Draw the triangles */
glDrawArrays(GL_TRIANGLES, 0, parts * 6);
glBindVertexArrayOES(0);
VAO Создание:
glBindVertexArrayOES(vao);
glEnableVertexAttribArray(ls.position);
glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0);
glEnableVertexAttribArray(ls.color);
glVertexAttribPointer(ls.color, 3, GL_FLOAT, GL_FALSE, buffer.stride(), GL_BUFFER_OFFSET(buffer.dataTypeSize * 2));
glBindVertexArrayOES(0);
Где ls
это простой, struct
который содержит атрибуты местоположения.
В части «Рендеринг» обмен glBindBuffer
и glBindVertexArrayOES
окружение тоже не работали.
Итак, вопрос в том, возможно ли это сделать, или мне придется создавать для каждого буфера VAO? И если мне нужно создать VAO для каждого VBO, возможно ли обновить данные VBO, используя glBufferSubData
в сочетании с VAO?
VAO хранит состояние glVertexAttribPointer. Изменение VAO не влияет на текущий glBindBuffer, а изменение glBindBuffer не влияет на VAO. Только вызов glVertexAttribPointer влияет на VAO, записывая используемый буфер при вызове.
Так что ответ на ваш вопрос - нет.
Один из вариантов, если вы хотите уменьшить количество объектов, - это поместить все данные сетки в один большой VBO и указать, где данные сетки находятся в VBO, в вызове glDrawArrays, используя аргументы first и count.
источник
glBindBuffer
состояние, кромеGL_ELEMENT_ARRAY_BUFFER
измененного, связывается с VAO.