2012-12-23 20 views
12

Próbuję nauczyć się WebGL (z tego samouczka: http://learningwebgl.com/blog/?page_id=1217). Poszedłem za przewodnikiem, a teraz próbuję wprowadzić własne demo. Chcę utworzyć obiekt graficzny zawierający bufory i dane dla poszczególnych obiektów, które pojawią się w scenie. Obecnie mam bufor pozycji wierzchołków, bufor współrzędnych tekstury i bufor normalny. W samouczku używa innego bufora, bufora indeksu, ale tylko dla kostek. Do czego właściwie służy bufor indeksów? Czy powinienem go zaimplementować i czy jest on użyteczny dla czegoś innego niż kostki?Bufory indeksów w WebGL?

Odpowiedz

6

Wierzchołki twoich obiektów definiowane są przez pozycje w układzie współrzędnych 3D (euclidian coordinate system). Możesz więc wziąć co dwa kolejne wierzchołki i połączyć je z linią zaraz po tym, jak twoje układy współrzędnych 3D zostaną rzucone na rastr 2D (ekran lub jakiś docelowy obraz) przez rasterization process. Otrzymasz tzw. wireframe.

cube wireframe

Problem szkielet jest to, że nie jest definitywna. Jeśli spojrzysz na sześcian szkieletowy pod określonymi kątami, nie możesz powiedzieć, w jaki sposób sześcian dokładnie się obraca. To dlatego, że musisz użyć visibility algorithms, aby określić, która część sześcianu jest bliżej pozycji obserwatora (pozycja kamery).

Ale same linie nie mogą definiować powierzchni, która jest konieczna do określenia, która strona sześcianu jest bliżej obserwatora niż inne. Najlepszym sposobem definiowania powierzchni w grafice komputerowej są wielokąty, dokładnie trójkąt (ma wiele wad na grafikę komputerową).

Więc masz teraz sześcian zdefiniowany przez trójkąty (więc zadzwoń do siatki trójkątów).

cube triangle mesh

Ale jak zdefiniować których wierzchołki trójkąta formy? Przez bufor indeksu. Zawiera indeks do bufora wierzchołków (lista ze swoimi wierzchołkami) i informuje algorytm rasteryzacji, który tworzą trzy wierzchołki trójkąta. Istnieje wiele sposobów, w jaki sposób interpretować indeksy w buforze indeksu, aby zredukować powtarzanie tych samych wierzchołków (jeden wierzchołek może być częścią wielu trójkątów), niektóre z nich można znaleźć pod adresem article about graphics primitives.

+0

Dziękuję za jasne i szczegółowe wyjaśnienie! Właśnie tego szukałem. – Sefu

4

Technicznie nie potrzebujesz bufora indeksowego. Istnieją dwa sposoby renderowania geometrii, z i glDrawElements. glDrawArrays nie używa bufora indeksu. Po prostu zapisujesz wierzchołki jeden po drugim w buforach, a następnie mówisz GL, co zrobić z elementami. Jeśli używasz GL_TRIANGLES jako trybu połączenia, musisz umieścić trzykrotnie dane (wierzchołki, normalne, ...) w buforach, więc gdy wierzchołek jest używany wiele razy, musisz dodać do buforów wiele razy.

glDrawElements może służyć do przechowywania wierzchołka, a następnie użycia go kilka razy. Jest jednak jeden haczyk, zestaw parametrów dla pojedynczego indeksu jest stały, więc jeśli masz wierzchołek, w którym potrzebujesz dwóch różnych normaliów (lub innego atrybutu, takiego jak współrzędne tekstury lub kolory), musisz zapisać go dla każdego zestawu właściwości .

W przypadku kulek glDrawElements ma wiele sensu, ponieważ parametry są zgodne, ale w przypadku kostki wartości normalne są różne, powierzchnia przednia wymaga innej normalnej niż powierzchnia górna, ale położenie dwóch wierzchołków jest takie samo . Wciąż musisz umieścić pozycję w buforze dwa razy. W tym przypadku może być sensowne: glDrawArrays.

To zależy od danych, które potrzebuje mniej połączeń danych, ale glDrawElements jest bardziej elastyczny (jak zawsze można symulować glDrawArrays buforem indeksu, który zawiera numery 0, 1,2, 3, 4, ...).