Krótka odpowiedź:
Zastosowanie glMapBufferRange i tylko zaktualizować podzakresu, który wymaga modyfikacji.
Długa odpowiedź:
Sztuką jest, aby odwzorować już istniejący bufor z glMapBufferRange, a następnie tylko odwzorować zakres trzeba. Biorąc pod uwagę powyższe założenia:
- Twój geometria wykorzystuje animację per-vertex morfingu
- The liczbę wierzchołków dla modeli jest stała w trakcie animacji.
Następnie można użyć glMapBufferRange aktualizować tylko wymiany części, a resztę pozostawić danych sam. Przesyłanie pełne przy użyciu glBufferData jest powolne jak żółw, ponieważ usuwa stary magazyn pamięci i przydziela nowy. Oprócz przesyłania nowych danych. glMapBufferRange pozwala tylko na odczyt/zapis istniejących danych, nie przypisuje ani nie rozdziela.
Jeśli jednak korzystasz z animacji szkieletu, przekaż transformacje wierzchołków jako macierze 4x4 na wierzchołek do wierzchołka modułu cieniującego i wykonaj obliczenia. Dane dotyczące poszczególnych wierzchołków są oczywiście określone za pomocą glVertexAttribPointer.
Pamiętaj też, że możesz czytać dane tekstury w module cieniującym wierzchołków i że OpenGL 3.1 wprowadza pewne nowe wywołania rysowania instancji; glDrawArraysInstanced i glDrawElementsInstanced. Te połączone mogą być używane do wyszukiwania specyficznego dla instancji. Można np. Wywoływać wywołania z tymi samymi danymi geometrii, ale wysyłać pozycje lub dowolne dane na temat każdego wierzchołka, które są potrzebne, jako tekstury lub tablice tekstur. To może zaoszczędzić na mieszaniu i dopasowywaniu różnych zestawów danych macierzy wierzchołków.
Wyobraź sobie, że chcesz renderować 100 wystąpień tego samego modelu, ale z różnymi pozycjami lub schematami kolorów. A nawet mapy tekstur.
+1 za uznanie grupowania za największy problem z kodowaniem grafiki w dzisiejszych czasach. 1 remis na Mhz wydaje mi się optymistyczny po napisaniu kodu w niektórych programach OpenGL ES iPhone - odkryłem, że jestem ograniczony do 30-40 partii, aby utrzymać przyzwoitą ilość klatek na sekundę! – tsalter
Dobrze, powinienem dodać, że ta zasada może nie dotyczyć bezpośrednio urządzeń mobilnych. Widziałem to pierwszy raz na niektórych slajdach GDC kilka lat temu i dobrze mi to służyło na komputerach z systemem Windows. –
Btw, właśnie znalazłem slajdy tutaj: http://ati.amd.com/developer/gdc/D3DTutorial3_Pipeline_Performance.pdf (głównie D3D9, OpenGL na stronie 28) –