Stoję przed problemem, który moim zdaniem jest zależny od VAO, ale nie jestem pewien ...
Nie jestem pewien co do poprawnego użycia VAO, to co robiłem podczas inicjalizacji GL było proste
glGenVertexArrays(1,&vao)
po którym następuje
glBindVertexArray(vao)
a później, w moim potoku rysunkowym, właśnie wywołałem glBindBuffer (), glVertexAttribPointer (), glEnableVertexAttribArray () i tak dalej ... bez dbania o początkowo powiązany VAO
czy to poprawna praktyka?
Odpowiedzi:
VAO działają podobnie do VBO i tekstur pod względem sposobu ich wiązania. Posiadanie jednego VAO związanego na całą długość programu nie przyniesie żadnych korzyści w zakresie wydajności, ponieważ równie dobrze możesz po prostu renderować bez VAO. W rzeczywistości może to być wolniejsze w zależności od tego, jak implementacja przechwytuje ustawienia atrybutów wierzchołków podczas ich rysowania.
Celem VAO jest uruchomienie wszystkich metod niezbędnych do narysowania obiektu raz podczas inicjalizacji i wyeliminowanie całego dodatkowego obciążenia wywołania metody podczas głównej pętli. Chodzi o to, aby mieć wiele VAO i przełączać się między nimi podczas rysowania.
Jeśli chodzi o najlepsze praktyki, oto jak powinieneś zorganizować swój kod:
Pozwala to uniknąć bałaganu związanego z wiązaniem / odłączaniem buforów i przekazywaniem wszystkich ustawień dla każdego atrybutu wierzchołka i zastępuje je jednym wywołaniem metody, wiążąc VAO.
źródło
Nie, nie w ten sposób używasz VAO. Powinieneś używać VAO w ten sam sposób, w jaki używasz VBO, tekstur lub shaderów. Najpierw skonfiguruj. A podczas renderowania tylko Bind je, bez modyfikowania.
Więc z VAO wykonujesz następujące czynności:
void Setup() { glGenVertexArrays(..); glBindVertexArray(..); // now setup all your VertexAttribPointers that will be bound to this VAO glBindBuffer(..); glVertexAttribPointer(..); glEnableVertexAttribArray(..); } void Render() { glBindVertexArray(vao); // that's it, now call one of glDraw... functions // no need to set up vertex attrib pointers and buffers! glDrawXYZ(..) }
Zobacz także te linki:
źródło
glEnableVertexAttribArray(...)
należy zadzwonić wcześniejglVertexAttribPointer(...)
. Niektórzy kierowcy (w tym mój) naprawdę nie lubią tego na odwrót.Tak, jest to całkowicie legalne i ważne. Czy to jest dobre? Dobrze...
Były pewne nieformalne testy wydajności tego rodzaju rzeczy. I wydaje się, że przynajmniej na sprzęcie NVIDIA, na którym to testowano, „właściwe” użycie VAO (tj. Za tym, co wszyscy zalecali) w wielu przypadkach jest wolniejsze . Jest to szczególnie prawdziwe, jeśli zmiana VAO nie zmienia, które bufory są powiązane.
O ile mi wiadomo, żadne podobne testy wydajności nie zostały przeprowadzone na sprzęcie AMD. Ogólnie rzecz biorąc, jeśli coś się z nimi nie zmieni, jest to dopuszczalne użycie VAO.
źródło
Powyższa odpowiedź Roberta zadziałała, gdy ją wypróbowałem. W tym miejscu warto użyć kodu w Go używającego wielu obiektów atrybutów wierzchołków:
// VAO 1
Następnie w głównej pętli możesz ich używać jako takich:
Jeśli chcesz zobaczyć pełne źródło, jest dostępne jako Gist i pochodzi z przykładów w go-gl:
https://gist.github.com/mdmarek/0f73890ae2547cdba3a7
Dziękuję wszystkim za oryginalne odpowiedzi, miałem to samo pytanie co ECrownofFire.
źródło