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 glDrawArray
połą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 ls
jest prosty, struct
który zawiera lokalizacje atrybutów.
W części Rendering zamiana glBindBuffer
i glBindVertexArrayOES
reszta 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 glBufferSubData
w połączeniu z VAO?