Ludzie ciągle mówią mi, żebym używał przynajmniej tablic wierzchołków. Ale myślę, że nie jest to dobry pomysł, ponieważ używam glPushMatrix()
z glTranslatef/glRotatef
do pozycjonowania obiektu w świecie 3d.OpenGL: Jak zaprojektować wydajny system renderowania za pomocą tablic vertex z sortowaniem głębokości?
Więc, powinienem przestać używać i obliczyć obrócone/przesunięte pozycje wierzchołków w świecie "ręcznie", a następnie wypchnąć ich dane werteksów do tablicy wierzchołków, a następnie renderować je wszystkie naraz?
Ale wszystko to jeszcze bardziej popsuje się, gdy używam różnych powierzchni teksturowych dla wszystkich obiektów na ekranie, które są również sortowane głębiej.
Więc:
- musiałbym zapisać każdy obiekt z identyfikatorem teksturę powierzchni, jak również.
- Służy do sortowania wszystkich widocznych obiektów po ich pozycji Z (gra jest wyświetlana tylko z góry na dół, a wszystkie obiekty są płaskie).
- chciałbym przejść przez ten posortowanej tablicy:
- Utwórz nowy bufor i skopiować tylko wierzchołek/texcoord/kolor/normalny do tego bufora:
- Za każdym razem identyfikator tekstury powierzchnia uległa zmianie od poprzedniego ID, będzie wiążę do poprawnego tekstury ID:
- Prześlij zebrane dane wierzchołków.
- Uwolnij bufor używany do tymczasowej tablicy wierzchołków.
- Powtarzaj kroki 4-7, aż przejdę przez wszystkie dane posortowane na pierwszym miejscu.
- Uwolnij moje posortowane dane z tablicy i powtórz kroki 1-9.
Czy robię to dobrze?
Ponadto, jak powinienem zaprojektować strukturę danych dla obiektów, które posortuję? Na przykład, czy dobrze jest użyć std::vector
do przechowywania danych wierzchołków dla każdego obiektu? Czy istnieje lepsza alternatywa? Myślałam, że std::vector
przechowywać wszystkie te dane będą wyglądać następująco:
struct GameObject {
int TexID;
float z; // we will sort by this
vector<VTCNStruct> VertexData; // store each point of the object here (including color/normal/texcoord points).
};
vector<GameObject> GameObjectBuffer; // push all sortable objects here
Również w kroku 4: czy jest to możliwe do wykorzystania już istniejącego std::vector
w tym przypadku? Wpadłem na pomysł, że muszę używać surowych tablic, takich jak new float[100]
do wysyłania tablicy wierzchołków do mojego GPU, lub czy w jakiś sposób mogę użyć mojego już sortowanego std::vector
tutaj (wydajnie) bez tworzenia nowego bufora za każdym razem, gdy zmienia się ID tekstury ?
"Należy zachować jedną tablicę wierzchołków za obiekt" - jest to mądry w ogóle? ponieważ większość moich obiektów to po prostu quady, a to nie wykorzystuje większej przepustowości teraz, kiedy nie tylko wysyłam więcej danych do GPU (w postaci kolorów/normalnych tablic), ale także musiałbym wysyłać polecenia wysyłania tablicy wierzchołków pomiędzy każdym obiektem . – Newbie
Jak zawalić moje transformacje w jedną macierz? Co więcej, nie masz na myśli, od tyłu do przodu? Więc zasadniczo sugerujesz, że zachowam 'glPushMatrix()', ale zamiast 'glBegin/glEnd' używałbym tablic wierzchołków? JEŚLI CHCEMY SIĘ użyć VBO, czy powinienem zachować to samo podejście, które zasugerowałeś? – Newbie
Nowicjusz - nie jestem programistą OpenGL, ale uważam, że Josh oznacza, że najpierw należy przesunąć obiekty znajdujące się najwyżej (na przykład w szafie na ekranie), najdalej na końcu. EDYCJA - Po zwijaniu przekształca się w jedną macierz, wierzę, że można użyć sztuczek matematycznych, aby uzyskać jedną transformację zarówno do poruszania/obracania/etc. za jednym zamachem. – ZachS