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?
VAO przechowuje stan glVertexAttribPointer. Zmiana VAO nie wpływa na bieżący glBindBuffer, ani zmiana glBindBuffer nie wpływa na VAO. Tylko wywołanie glVertexAttribPointer wpływa na VAO, rejestrując bufor używany podczas połączenia.
Odpowiedź na twoje pytanie brzmi: nie.
Jedną z opcji, jeśli chcesz zmniejszyć liczbę obiektów, jest umieszczenie wszystkich danych siatki w jednym dużym VBO i określenie, gdzie dane siatki znajdują się w VBO w wywołaniu glDrawArrays przy użyciu argumentów „first” i „count”.
źródło
glBindBuffer
stan opróczGL_ELEMENT_ARRAY_BUFFER
zmieniany jest przez związanie VAO.