Właśnie zaczynam uczyć się OpenGL dzisiaj z tego samouczka: http://openglbook.com/the-book/
Dotarłem do rozdziału 2, w którym rysuję trójkąt i rozumiem wszystko oprócz VAO (czy ten akronim jest w porządku?). Samouczek ma ten kod:
glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);
Chociaż rozumiem, że kod jest niezbędny, nie mam pojęcia, co robi. Chociaż nigdy nie używam VaoId po tym punkcie (z wyjątkiem zniszczenia go), kod nie działa bez niego. Zakładam, że dzieje się tak, ponieważ jest to wymagane, ale nie wiem dlaczego. Czy dokładnie ten kod musi po prostu być częścią każdego programu OpenGL? Samouczek wyjaśnia VAO jako:
Obiekt Vertex Array (lub VAO) to obiekt, który opisuje, w jaki sposób atrybuty wierzchołków są przechowywane w obiekcie Vertex Buffer Object (lub VBO). Oznacza to, że VAO nie jest rzeczywistym obiektem przechowującym dane wierzchołków, ale deskryptorem danych wierzchołków. Atrybuty wierzchołków można opisać funkcją glVertexAttribPointer i jej dwiema siostrzanymi funkcjami glVertexAttribIPointer i glVertexAttribLPointer, z których pierwszą zajmiemy się poniżej.
Nie rozumiem, jak VAO opisuje atrybuty wierzchołków. W żaden sposób ich nie opisałem. Czy pobiera informacje z glVertexAttribPointer? Myślę, że to musi być to. Czy VAO to po prostu miejsce docelowe dla informacji z glVertexAttribPointer?
Na marginesie, czy samouczek, który śledzę, jest do przyjęcia? Czy jest coś, na co powinienem uważać lub lepszy poradnik do naśladowania?
źródło
glVertexAttribPointer
VertexArrayMacro
lub coś podobnego.Obiekty tablicy wierzchołków są jak makra w programach do przetwarzania tekstu i tym podobnych. Dobry opis znajduje się tutaj .
Makra po prostu zapamiętują wykonane przez Ciebie czynności, takie jak aktywacja tego atrybutu, powiązanie tego bufora itp. Kiedy wywołujesz
glBindVertexArray( yourVAOId )
, po prostu odtwarza te powiązania wskaźnika atrybutów i powiązania bufora.Więc twoje następne sprawdzenie do drawa wykorzystuje wszystko, co było związane z VAO.
VAO nie przechowują danych wierzchołków . Nie. Dane wierzchołków są przechowywane w buforze wierzchołków lub w tablicy pamięci klienta.
źródło
Zawsze myślę o VAO jako o tablicy buforów danych używanych przez OpenGL. Używając nowoczesnego OpenGL, utworzysz obiekty VAO i Vertex Buffer.
Następnym krokiem jest powiązanie danych z buforem:
W tym momencie OpenGL widzi:
Teraz możemy użyć glVertexAttribPointer, aby powiedzieć OpenGL, jakie dane w buforze reprezentują:
OpenGL ma teraz dane w buforze i wie, jak dane są zorganizowane w wierzchołki. Ten sam proces można zastosować do współrzędnych tekstury itp., Ale dla współrzędnych tekstury byłyby dwie wartości.
Następnie możesz wiązać tekstury i rysować tablice, będziesz chciał stworzyć moduł cieniujący Vert i Frag, skompilować i dołączyć go do programu (nie jest tutaj uwzględniony).
źródło
VAO to obiekt, który reprezentuje etap pobierania wierzchołków potoku OpenGL i służy do dostarczania danych wejściowych do Vertex Shader.
Możesz utworzyć obiekt tablicy wierzchołków w ten sposób
Najpierw zróbmy prosty przykład. Rozważmy taki parametr wejściowy w kodzie modułu cieniującego
Aby wypełnić ten atrybut, możemy użyć
Chociaż obiekt tablicy wierzchołków przechowuje te statyczne wartości atrybutów dla ciebie, może zrobić o wiele więcej.
Po utworzeniu obiektu tablicy wierzchołków możemy przystąpić do wypełniania jego stanu. Poprosimy OpenGL o automatyczne wypełnienie go przy użyciu danych przechowywanych w dostarczonym przez nas obiekcie buforowym. Każdy atrybut wierzchołka pobiera dane z bufora związanego z jednym z kilku powiązań bufora wierzchołków. W tym celu używamy
glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex)
. Używamy równieżglVertexArrayVertexBuffer()
funkcji do wiązania bufora z jednym z powiązań bufora wierzchołków. UżywamyglVertexArrayAttribFormat()
funkcji do opisu układu i formatu danych, a na końcu umożliwiamy automatyczne wypełnianie atrybutu przez wywołanieglEnableVertexAttribArray()
.Gdy atrybut wierzchołka jest włączony, OpenGL przesyła dane do modułu cieniującego wierzchołki na podstawie formatu i informacji o lokalizacji, które podałeś w
glVertexArrayVertexBuffer()
iglVertexArrayAttribFormat()
. Gdy atrybut jest wyłączony, moduł cieniujący wierzchołków otrzyma statyczne informacje, które podasz w wywołaniuglVertexAttrib*()
.I koduj w module cieniującym
W końcu musisz zadzwonić
glDeleteVertexArrays(1, &vao)
.Możesz przeczytać OpenGL SuperBible, aby lepiej to zrozumieć.
źródło