Widzę, że OpenGL w wersji 3 i wyższej eliminuje użycie renderowania po stronie klienta. Tryb natychmiastowy został wyeliminowany, a tablice wierzchołków wydają się przestarzałe. Zamiast tego, jeśli dobrze rozumiem, VBO są głównym sposobem renderowania wierzchołków.
Chociaż widzę logikę kryjącą się za jednolitym sposobem renderowania wszystkiego, to czy przypadkiem VBO nie mają poważnych wad w porównaniu z tablicami wierzchołków? Myślałem, że VBO powinny być dużymi buforami zawierającymi> 1 MB danych. Co jeśli mam scenę, która ma dużo mniejszą geometrię? Mam wykres sceny z dużą liczbą węzłów, z których każdy wymaga własnej transformacji itp. Każdy węzeł powinien mieć możliwość oddzielnego usuwania, dodawania do osobnych itp. Wcześniej używałem tablic wierzchołków. Moje pierwsze pytanie brzmi więc, czy jeśli przejdę na VBO, będzie więcej obciążeń dla obiektów wykresu sceny, ponieważ dla każdego obiektu należy przydzielić VBO.
Innym problemem jest to, że geometria, którą renderuję, może być bardzo dynamiczna. W najgorszym przypadku mogą zdarzyć się chwile, gdy cała geometria będzie musiała zostać ponownie wysłana do każdej klatki przez pewien okres czasu. Czy VBO będą miały gorszą wydajność niż tablice wierzchołków w tym przypadku użycia, czy też VBO w najgorszym przypadku wykonują tyle samo pracy, co tablice wierzchołków, ale nie więcej?
Tak więc, w bardziej zwięzłym formacie, moje pytania są następujące:
1) Czy istnieje znaczny narzut związany z przydzielaniem / zwalnianiem VBO (mam na myśli sam fakt utworzenia bufora)?
2) Jeśli aktualizuję dane z procesora w każdej ramce, czy może to być znacznie gorsze niż w przypadku użycia tablic wierzchołków?
Na koniec chciałbym wiedzieć:
3) Jeśli odpowiedź na którekolwiek z powyższych pytań brzmi „tak”, po co odrzucać inne tryby renderowania, które mogłyby mieć przewagę nad VBO? Czy czegoś mi brakuje, na przykład technik, które powinienem zastosować, aby zmniejszyć niektóre z tych potencjalnych kosztów alokacji itp.?
4) Czy odpowiedzi na którekolwiek z tych pytań ulegają zasadniczej zmianie w zależności od używanej wersji OpenGL? Jeśli zmienię kod mojego kodu na zgodny z OpenGL 3 lub 4, używając VBO w sposób, który jest wydajny, czy te same techniki będą działały dobrze w OpenGL 2, czy też jest prawdopodobne, że niektóre techniki są znacznie szybsze w OpenGL 3 + i inne z OpenGL 2?
Zadałem to pytanie na temat przepełnienia stosu, ale przesyłam ponownie tutaj, ponieważ zdałem sobie sprawę, że ta strona może być bardziej odpowiednia do mojego pytania.