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);