to get the file
Transkrypt
to get the file
Laboratorium nr 8 Instrukcja laboratoryjna 8 1) 1/6 Grafika Komputerowa Temat: Listy wyświetlania i tablice wierzchołków Przygotował: mgr inż. Maciej Lasota Listy wyświetlania Listy wyświetlania (ang. display lists) pełnią ważną role w bibliotece OpenGL. Zasada działania list wyświetlania sprowadza się do grupowania instrukcji biblioteki OpenGL. Tak pogrupowane instrukcje można wykorzystywać wielokrotnie w dalszej części kodu źródłowego. Dzięki listom wyświetlania możliwe jest wyrenderowanie np. sześcianu tylko jeden raz przy starcie aplikacji, a następnie wielokrotne wykorzystanie tego kodu. 1.1) Tworzenie i usuwanie list Listy wyświetlania podobnie jak tekstury potrzebują swojego identyfikatora reprezentowanego przez liczbę całkowitoliczbową. Na podstawie tego identyfikatora możemy utworzyć listę lub kilka list jednocześnie. int mojaLista; Do generowania identyfikatora listy wyświetlania wykorzystujemy funkcję glGenLists, funkcja ta przyjmuje jeden parametr określający liczbę list do wygenerowania GLuint glGenLists(GLsizei range); mojaLista = glGenLists(1); Każdą wygenerowaną i już niepotrzebną listę należy usunąć za pomocą funkcji glDeleteLists. Funkcja ta przyjmuje dwa parametry. Pierwszy parametr list określa identyfikator list, drugi range natomiast liczbę tych list. void glDeleteLists(GLuint list, GLsizei range); glDeleteLists(mojaLista,1); Laboratorium nr 8 1.2) 2/6 Umieszczanie instrukcji na liście Przed umieszczaniem instrukcji, należy listę odpowiednio przygotować. Służy do tego celu funkcja glNewList. Pierwszy parametr funkcji, to zmienna wskazująca na listę, drugi parametr to tryb. void glNewList(GLuint list, GLenum mode); Parametr „mode” Opis GL_COMPILE Umieszczenie instrukcji na liście GL_COMPILE_AND_EXECUTE Umieszczenie i natychmiastowe jednorazowe wywołanie instrukcji znajdujących się na liście Po wywołaniu funkcji glNewLists wypisujemy wszystkie instrukcje, które znajdą się na liście. Listę należy zamknąć funkcją glEndList. Przykład 1: mojalLista = glGenLists(1); glNewLists(mojaLista, GL_COMPILE); glBegin(GL_QUADS); glVertex2f(270, 190); glVertex2f(370, 190); glVertex2f(370, 290); glVertex2f(270, 290); glEnd(); glEndList(); UWAGA!!! Fragment kodu generujący listę należy umieścić w takim miejscu kodu źródłowego, który wykonuje się tylko raz na początku działania aplikacji. W czasie działania aplikacji nie ma możliwości modyfikacji wierzchołków generowanego obiektu Laboratorium nr 8 3/6 Przykład 2: mojalLista = glGenLists(3); glNewLists(mojaLista, GL_COMPILE); glBegin(GL_QUADS); glVertex2f(270, 190); glVertex2f(370, 190); glVertex2f(370, 290); glVertex2f(270, 290); glEnd(); glEndList(); glNewLists(mojaLista + 1, GL_COMPILE); glBegin(GL_QUADS); glVertex2f(270, 190); glVertex2f(370, 190); glVertex2f(370, 290); glVertex2f(270, 290); glEnd(); glEndList(); glNewLists(mojaLista + 2, GL_COMPILE); glBegin(GL_QUADS); glVertex2f(270, 190); glVertex2f(370, 190); glVertex2f(370, 290); glVertex2f(270, 290); glEnd(); glEndList(); UWAGA!!! mojaLista, mojaLista + 1 oraz mojaLista + 2 to trzy zupełne różne listy wyświetlania wygenerowane w obrębie tego samego identyfikatora. Laboratorium nr 8 1.3) 4/6 Wykonywanie list wyświetlania Do wykonywania list wyświetlania służą dwie funkcje. Pierwsza glCallList wykonuje dokładnie jedną listę. Przyjmuje ona identyfikator listy, którą wykonuje. void glCallList(GLuint list); Druga funkcja to glCallLists, która wykonuje tablicę list. Przyjmuje ona trzy parametry. Pierwszy parametr to liczba wykonywanych list. Drugi parametr wskazuje typ list znajdujących się w tablicy i może przyjąć wartość jednej ze stałych: GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT. Trzeci parametr to wskaźnik na tablicę list. void glCallLists(GLsizei n, GLenum type, const GLvoid *lists); 2) Tablice wierzchołków Zaletą list wyświetlania jest to, że można w nich umieszczać wywołania funkcji OpenGL (nawet funkcje renderujące obiekty). Natomiast gdy obiekt składa się z kilku tysięcy trójkątów, lepszym rozwiązaniem jest zastosowanie tablic wierzchołków. Tablice wierzchołków umożliwiają przechowywanie danych w specjalnych tablicach dotyczących wierzchołków, a następnie wyrenderowanie obiektów na podstawie danych z tych tablic. 2.1) Włączanie i wyłączanie tablic wierzchołków Aby używać tablic wierzchołków, musimy najpierw włączyć ich mechanizm w OpenGL. Służą do tego dwie funkcje glEnableClientState oraz glDisableClientState. void glEnableClientState(GLenum cap); void glDisableClientState(GLenum cap); Funkcje te przyjmują jako parametr typ włączanej i wyłączanej tablicy wierzchołków. Laboratorium nr 8 5/6 Parametr „cap” Opis GL_VERTEX_ARRAY Tablica przechowuje współrzędne wierzchołków GL_NORMAL_ARRAY Tablica przechowuje wartości wektorów normalnych wierzchołków GL_TEXTURE_COORD_ARRAY Tablica przechowuje współrzędne tekstur wierzchołków GL_COLOR_ARRAY Tablica przechowuje wartości kolorów wierzchołków GL_INDEX_ARRAY Tablica przechowuje indeksowane wartości kolorów wierzchołków GL_EDGE_FLAG_ARRAY Tablica przechowuje znaczniki krawędzi wierzchołków Do przypisywania danych do tablic wykorzystujemy specjalne funkcje. Jest ich tyle samo co rodzajów tablic wierzchołków. Funkcja glVertexPointer przypisuje dane o współrzędnych wierzchołkowych. Pierwszy parametr określa liczbę współrzędnych i przyjmuje wartości całkowite od 2 do 4. Parametr type określa typ wierzchołków i może przyjmować wartości stałych GL_FLOAT, GL_INT lub GL_DOUBLE. Parametr stride określa liczbę bajtów, jakie przypadają na jeden segment danych (zazwyczaj ustawiamy na 0). Ostatni parametr pointer określa wskaźnik na tablicę z danymi. void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); Funkcja glNormalPointer przypisuje dane o wektorach normalnych wierzchołkowych. Znaczenie parametrów jest takie same jak w przypadku glVertexPointer. Funkcja ta nie posiada parametru size. void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer); Funkcja glTexCoordPointer przypisuje dane o współrzędnych tekstur. Znaczenie parametrów jest takie same jak w przypadku glVertexPointer. void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); Funkcja glColorPointer przypisuje dane o kolorach wierzchołków. Znaczenie parametrów jest takie same jak w przypadku glVertexPointer. Laboratorium nr 8 6/6 void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); Funkcja glIndexPointer przypisuje dane o indeksach kolorów. Znaczenie parametrów jest takie same jak w przypadku glNormalPointer. void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer); Funkcja glEdgeFlagPointer przypisuje dane o znacznikach krawędzi. void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer); 2.2) Renderowanie z wykorzystaniem tablic wierzchołków Do wyrednerowania obiektów na podstawie tablic wierzchołków, wykorzystujemy trzy różne funkcje. Pierwszą funkcją jest glDrawArrays, przyjmuje ona trzy parametry. Parametr pierwszy określa jakie prymitywy mają być renderowane z wykorzystaniem danych z tablic. Parametr drugi to indeks wierzchołka, od którego rozpoczyna się renderowanie. Trzeci parametr określa liczbę wierzchołków jaka zostanie wyrenderowana. void glDrawArrays(GLenum mode, GLint first, GLsizei count); Drugą funkcją jest glDrawElements, przyjmuje ona cztery parametry. Parametr pierwszy definiuje jakiego typu prymitywy będą renderowane. Drugi to liczba indeksów jaka zostanie użyta do renderowania. Trzeci parametr określa typ indeksów w tablicy. Czwarty to wskaźnik na tablicę wierzchołków. void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); Trzecią funkcją jest glArrayElement. Funkcja ta wybiera z listy wierzchołek o indeksie podanym w parametrze i wykorzystuje go do renderowania. Należy ją wywoływać pomiędzy blokami glBegin oraz glEnd. void glArrayElement(GLint i);