We wszystkich samouczkach, które mogę znaleźć o VAO (obiektach tablicy wierzchołków), pokazują one, jak ich używać, konfigurując atrybuty wierzchołków i wiążąc VBO (obiekt bufora wierzchołków). Ale chcę utworzyć VAO, który zostanie skonfigurowany dla zestawu VBO w połączeniu ze stałym shaderem, w którym każdy bufor używa tego samego wzorca danych (wierzchołek, ultrafiolet, kolor itp.). Chcę więc utworzyć jedno VAO dla wielu VBO, które zostaną narysowane przy użyciu jednego modułu cieniującego.
Nie mogłem znaleźć żadnej wersji demo, więc postanowiłem spróbować. Ale to nie działa i zawiesza się podczas glDrawArraypołączenia. Wygląda na to, że VBO nie jest związane. Oto kod, którego używam:
Wykonanie:
/* 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);
Kreacja 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);
Gdzie lsjest prosty, structktóry zawiera lokalizacje atrybutów.
W części Rendering zamiana glBindBufferi glBindVertexArrayOESreszta również nie działały.
Pytanie brzmi: czy jest to w ogóle możliwe, czy też muszę utworzyć dla każdego bufora wartość VAO? A jeśli muszę utworzyć VAO dla każdego VBO, czy można zaktualizować dane VBO przy użyciu glBufferSubDataw połączeniu z VAO?