У всіх підручниках, які я можу знайти про VAO (Vertex Array Objects), вони показують, як їх використовувати, конфігуруючи атрибути вершин і прив’язуючи VBO (Vertex Buffer Object). Але я хочу створити 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?