Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL dr inż. Piotr Steć

Podobne prezentacje


Prezentacja na temat: "Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL dr inż. Piotr Steć"— Zapis prezentacji:

1 Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL dr inż. Piotr Steć

2 Czym jest OpenGL Biblioteka programistyczna Biblioteka programistyczna Interfejs pomiędzy sprzętem a programistą Interfejs pomiędzy sprzętem a programistą Uniezależnia programistę od platformy sprzętowej i programowej Uniezależnia programistę od platformy sprzętowej i programowej Bazuje na bibliotece Iris GL opracowanej przez Silicon Graphics Bazuje na bibliotece Iris GL opracowanej przez Silicon Graphics Wszystkie nowoczesne karty graficzne wspierają sprzętowo funkcje OpenGL Wszystkie nowoczesne karty graficzne wspierają sprzętowo funkcje OpenGL Pierwsza wersja powstała w 1992r. Pierwsza wersja powstała w 1992r.

3 Zalety OpenGL Całkowite uniezależnienie od możliwości karty graficznej Całkowite uniezależnienie od możliwości karty graficznej Prosty i przejrzysty kod programu Prosty i przejrzysty kod programu Program wygląda prawie tak samo we wszystkich językach programowania i na wszystkich platformach systemowych Program wygląda prawie tak samo we wszystkich językach programowania i na wszystkich platformach systemowych Biblioteka jest darmowa i można jej używać we własnych programach bez ograniczeń Biblioteka jest darmowa i można jej używać we własnych programach bez ograniczeń

4 Jak działa OpenGL Schemat potoku renderującego

5 Listy wyświetlania Dwa tryby pracy OpenGL: Dwa tryby pracy OpenGL: immediate mode – komendy graficzne wykonywane są natychmiastimmediate mode – komendy graficzne wykonywane są natychmiast retained mode – komendy graficzne przechowywane są w listachretained mode – komendy graficzne przechowywane są w listach Listy mogą być wielokrotnie wykonywane Listy mogą być wielokrotnie wykonywane

6 Ewaluacja Blok ten przekształca dane sterujące na parametry i współrzędne przestrzenne Blok ten przekształca dane sterujące na parametry i współrzędne przestrzenne Może generować: Może generować: Powierzchnie NURBSPowierzchnie NURBS Mapowanie teksturMapowanie tekstur Wektory normalneWektory normalne Informację o kolorzeInformację o kolorze

7 Operacje na wierzchołkach i budowanie prymitywów Wierzchołki obiektów poddawane są transformacjom Wierzchołki obiektów poddawane są transformacjom Obiekty 3D są rzutowane na płaszczyznę 2D (ekran) Obiekty 3D są rzutowane na płaszczyznę 2D (ekran) Obcinane są niewidoczne części obiektów Obcinane są niewidoczne części obiektów Obliczane jest oświetlenie obiektów Obliczane jest oświetlenie obiektów

8 Operacje na pikselach Pobieranie bitmap z pamięci Pobieranie bitmap z pamięci Konwersja formatów pikseli Konwersja formatów pikseli Skalowanie Skalowanie Filtracja Filtracja Kopiowanie Kopiowanie

9 Tworzenie tekstur Tworzenie tekstur z bitmap Tworzenie tekstur z bitmap Łączenie wielu bitmap w teksturę Łączenie wielu bitmap w teksturę Organizacja pamięci tekstur Organizacja pamięci tekstur Generowanie MIPMap Generowanie MIPMap Filtracja tekstur Filtracja tekstur

10 Rasteryzacja Zamiana danych wektorowych, parametrów oświetlenia i materiałów na tzw. fragmenty: Zamiana danych wektorowych, parametrów oświetlenia i materiałów na tzw. fragmenty: wierzchołki łączone są liniamiwierzchołki łączone są liniami wielokąty są wypełniane z uwzględnieniem cieniowaniawielokąty są wypełniane z uwzględnieniem cieniowania Fragment jest surowym odpowiednikiem piksela, czyli jednego punktu na ekranie Fragment jest surowym odpowiednikiem piksela, czyli jednego punktu na ekranie Fragment zwykle zawiera więcej informacji niż piksel, np. głębię czy wartości buforów specjalnych Fragment zwykle zawiera więcej informacji niż piksel, np. głębię czy wartości buforów specjalnych

11 Operacje na fragmentach Teksturowanie Teksturowanie Obliczanie wartości mgły Obliczanie wartości mgły Mieszanie z buforem alfa Mieszanie z buforem alfa Uwzględnianie szablonów Uwzględnianie szablonów Operacje na buforze Z Operacje na buforze Z Operacje logiczne Operacje logiczne Wynik końcowy: piksel zapisany do bufora ramki Wynik końcowy: piksel zapisany do bufora ramki

12 Bufor ramki Pamięć przechowująca piksele, które mają być wyświetlone na ekranie Pamięć przechowująca piksele, które mają być wyświetlone na ekranie Wielkość bufora ramki zależy od wielkości okna w którym wyświetlana jest grafika Wielkość bufora ramki zależy od wielkości okna w którym wyświetlana jest grafika OpenGL może obsługiwać wiele buforów ramki OpenGL może obsługiwać wiele buforów ramki Najczęściej stosuje się 2 bufory ramki: Najczęściej stosuje się 2 bufory ramki: Jeden jest wyświetlany (front), drugi jest używany do rysowania (back)Jeden jest wyświetlany (front), drugi jest używany do rysowania (back) Po zakończeniu rysowania bufory zamieniane są miejscami (podwójne buforowanie)Po zakończeniu rysowania bufory zamieniane są miejscami (podwójne buforowanie) W przypadku wyświetlania stereo, stosowane są 4 bufory (po 2 na jedno oko) W przypadku wyświetlania stereo, stosowane są 4 bufory (po 2 na jedno oko)

13 Składnia komend OpenGL Wszystkie komendy rozpoczynają się przedrostkiem gl np. glClearColor() Wszystkie komendy rozpoczynają się przedrostkiem gl np. glClearColor() Wszystkie stałe rozpoczynają się przedrostkiem GL_, np. GL_FRONT Wszystkie stałe rozpoczynają się przedrostkiem GL_, np. GL_FRONT Komendy są tworzone według jednego schematu: Komendy są tworzone według jednego schematu: glColor3f( biblioteka komenda typ parametrów liczba parametrów

14 Przyrostki komend i typy parametrów Przyrostek Typ danych nazwa w C Definicja w OpenGL b 8-bit. liczba czałk. signed char GLbyte s 16-bit. liczba czałk. shortGLshort i 32-bit. liczba czałk. int GLint, GLsizei f 32-bit. liczba zmiennopozyc. floatGLfloat d 64-bit. liczba zmiennopozyc. doubleGLdouble np. glVertex2i(33,150); glvertex3f(12.34,100.1,0.5);

15 Szkielet programu 1. Inicjalizacja biblioteki 2. Ustalenie wielkości okna i typu kamery 3. Opcjonalnie: zmiana parametrów kamery i zmiennych środowiska 4. Rysowanie obiektów 5. Jeśli nie koniec, to skok do 3 6. Zwalnianie zasobów

16 Pliki nagłówkowe W bibliotekach używających OpenGL należy podłączyć odpowiednie pliki nagłówkowe #include #include W bibliotekach używających OpenGL należy podłączyć odpowiednie pliki nagłówkowe #include #include Opcjonalnie można użyć pomocniczej biblioteki #include Opcjonalnie można użyć pomocniczej biblioteki #include Biblioteka glaux nie jest częścią standardu, jest nieoficjalna i nie jest standardowo dostępna. Należy samodzielnie zdobyć plik glaux.lib Biblioteka glaux nie jest częścią standardu, jest nieoficjalna i nie jest standardowo dostępna. Należy samodzielnie zdobyć plik glaux.lib

17 Kontekst urządzenia Kontekst urządzenia pod Windows pozwala na rysowanie Kontekst urządzenia pod Windows pozwala na rysowanie Ogólnie jest to ten element okna, który widzimy na ekranie (ale można uzyskać kontekst urządzenia również dla elementów niewidocznych) Ogólnie jest to ten element okna, który widzimy na ekranie (ale można uzyskać kontekst urządzenia również dla elementów niewidocznych) Globalna zmienna przechowująca kontekst: HDC hdc; Globalna zmienna przechowująca kontekst: HDC hdc; Pobieranie kontekstu w czasie inicjalizacji: hdc=GetDC(Handle); Pobieranie kontekstu w czasie inicjalizacji: hdc=GetDC(Handle); Zwalnianie kontekstu na końcu programu: ReleseDC(Handle, hdc); Zwalnianie kontekstu na końcu programu: ReleseDC(Handle, hdc);

18 Format piksela Format piksela jest niezależny od aktualnego trybu kolorów PIXELFORMATDESCRIPTOR pfd; ZeroMemory( &pfd, sizeof( pfd ) ); pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; int iFormat = ChoosePixelFormat( hDC, &pfd ); SetPixelFormat( hDC, iFormat, &pfd ); Format piksela jest niezależny od aktualnego trybu kolorów PIXELFORMATDESCRIPTOR pfd; ZeroMemory( &pfd, sizeof( pfd ) ); pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 16; int iFormat = ChoosePixelFormat( hDC, &pfd ); SetPixelFormat( hDC, iFormat, &pfd );

19 Kontekst renderingu Jest dla OpenGL tym samym, czym jest kontekst urządzenia dla Windows Jest dla OpenGL tym samym, czym jest kontekst urządzenia dla Windows Globalna zmienna przechowująca identyfikator: HGLRC hRC; Globalna zmienna przechowująca identyfikator: HGLRC hRC; Tworzenie kontekstu (można utworzyć kilka): hRC = wglCreateContext( hDC ); Tworzenie kontekstu (można utworzyć kilka): hRC = wglCreateContext( hDC ); Wybieranie aktywnego kontekstu: wglMakeCurrent( hDC, hRC ); Wybieranie aktywnego kontekstu: wglMakeCurrent( hDC, hRC ); Zwalnianie kontekstu na końcu programu: wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC ); Zwalnianie kontekstu na końcu programu: wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC );

20 Parametry wyświetlania Obszar okna, na którym będzie rysowana scena: Obszar okna, na którym będzie rysowana scena: glViewport(0, 0, ClientWidth, ClientHeight); Przełączenie w tryb edycji kamery: Przełączenie w tryb edycji kamery: glMatrixMode(GL_PROJECTION); Wyzerowanie kamery: Wyzerowanie kamery: glLoadIdentity(); Parametry projekcji: Parametry projekcji: gluPerspective(45.0,(double)ClientWidth/ (double)ClientHeight,0.1,100.0);

21 Viewport

22 Bryła obcinająca

23 Rysowanie obiektów Czyszczenie bieżącego bufora: Czyszczenie bieżącego bufora: glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Kolor czyszczący bufor można ustalić dowolnie funkcją (przed rysowaniem): Kolor czyszczący bufor można ustalić dowolnie funkcją (przed rysowaniem): glClearColor(0.0f, 1.0f, 0.0f, 0.0f); Przełączenie w tryb edycji obiektów: Przełączenie w tryb edycji obiektów: glMatrixMode(GL_MODELVIEW); Wyzerowanie transformacji: glLoadIdentity(); Wprowadzenie przesunięcia: glTranslatef(-1.5f,0.0f,-6.0f);

24 Rysowanie obiektów c.d. Narysowanie trójkąta (dowolna ilość komend glVertex ): Narysowanie trójkąta (dowolna ilość komend glVertex ): glBegin( GL_TRIANGLES ); glColor3d( 1.0, 0.0, 0.0 ); glVertex3d( 0.0, 1.0, 0.0 ); glColor3d( 0.0, 1.0, 0.0 ); glVertex3d( -1.0, 0.0, 0.0 ); glColor4d( 0.0, 0.0, 1.0,0.5); glVertex3d( 1.0, 0.0, 0.0 ); glEnd(); Zamiana buforów ramki Zamiana buforów ramki SwapBuffers( _hdc ); //za

25 Rysowanie trójkątów

26 Punkty i linie

27 Wielokąty GL_POLYGON GL_QUADS

28 Rysowanie pasów trójkątów glBegin(GL_TRIANGLE_STRIP);

29 Pasy czworokątów i wachlarze trójkątów GL_QUAD_STRIP GL_TRINGLE_FAN

30 Kolory w OpenGL Kolor najczęściej jest podawany w postaci składowych RGB lub RGBA, gdzie A określa przeźroczystość Kolor najczęściej jest podawany w postaci składowych RGB lub RGBA, gdzie A określa przeźroczystość Każda składowa przyjmuje wartości z zakresu Każda składowa przyjmuje wartości z zakresu Taka reprezentacja jest niezależna od bieżącego trybu kolorów Taka reprezentacja jest niezależna od bieżącego trybu kolorów Kolor zmieniany jest komendą glColor np. Kolor zmieniany jest komendą glColor np. glColor3d( 1.0, 0.0, 0.0 ); (czerwony) Raz ustawiony kolor obowiązuje dla wszystkich rysowanych po zmianie obiektów Raz ustawiony kolor obowiązuje dla wszystkich rysowanych po zmianie obiektów

31 Współrzędne jednorodne Punkt w przestrzeni reprezentowany jest przez cztery współrzędne (x,y,z,w) Punkt w przestrzeni reprezentowany jest przez cztery współrzędne (x,y,z,w) Wsp. jednorodne reprezentują ten sam punkt wtedy, gdy jeden zestaw jest wielokrotnością drugiego, np. (2,1,1,4) i (4,2,2,8) Wsp. jednorodne reprezentują ten sam punkt wtedy, gdy jeden zestaw jest wielokrotnością drugiego, np. (2,1,1,4) i (4,2,2,8) Przynajmniej jedna ze współrzędnych musi być różna od zera ((0,0,0,0) – niedopuszczalne) Przynajmniej jedna ze współrzędnych musi być różna od zera ((0,0,0,0) – niedopuszczalne)

32 Przekształcenia 3D Translacja Translacja glTranslatef(-1.5f,0.0f,-6.0f); Skalowanie Skalowanie glScale(2.5f,1.0f,0.5f);

33 Obroty 3D glRotatef(33.0,1.0,0.0,0.0); Pierwszy parametr: kąt obrotu, Pozostałe trzy określają oś obrotu XYZ (w tym przypadku oś X)

34 Macierz jednostkowa Macierz oznaczająca brak przekształceń Macierz oznaczająca brak przekształceń glLoad Identity(); glLoad Identity();

35 Składanie przekształceń OpenGL przechowuje przekształcenia w postaci macierzy OpenGL przechowuje przekształcenia w postaci macierzy Wywoływanie funkcji powoduje mnożenie bieżącej macierzy, przez macierz odpowiedniego przekształcenia Wywoływanie funkcji glTranslate, glRotate, glScale powoduje mnożenie bieżącej macierzy, przez macierz odpowiedniego przekształcenia Przekształcenie musi być dokonane przed narysowaniem obiektu Przekształcenie musi być dokonane przed narysowaniem obiektu

36 Przykład przekształceń glTranslatef(-1.5f,0.0f,-6.0f); glBegin( GL_TRIANGLES ); glColor3d( 1.0, 0.0, 0.0 ); glVertex3d( 0.0, 1.0, 0.0 ); glColor3d( 0.0, 1.0, 0.0 ); glVertex3d( -1.0, 0.0, 0.0 ); glColor4d( 0.0, 0.0, 1.0,0.5); glVertex3d( 1.0, 0.0, 0.0 ); glEnd(); glTranslatef(3.0f,0.0f,0.0f); glBegin(GL_QUADS); glVertex3f(-1.0f, 1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 0.0f); glEnd();

37 Wektory normalne Wektor normalny jest to wektor prostopadły do danej powierzchni Wektor normalny jest to wektor prostopadły do danej powierzchni Wektory krawędziowe: Wektory krawędziowe: V 10 V 12

38 Wektory normalne c.d. Wektor normalny można uzyskać mnożąc wektorowo dwa wektory krawędziowe Wektor normalny można uzyskać mnożąc wektorowo dwa wektory krawędziowe Zwykle wektory normalne muszą być znormalizowane, czyli muszą mieć długość 1 Zwykle wektory normalne muszą być znormalizowane, czyli muszą mieć długość 1

39 Światło Oświetlenie jest obliczane dla każdego wierzchołka obiektu Oświetlenie jest obliczane dla każdego wierzchołka obiektu Aby można było obliczyć wartość oświetlenia, musi być podany wektor normalny dla wierzchołka Aby można było obliczyć wartość oświetlenia, musi być podany wektor normalny dla wierzchołka Jasność wnętrza wielokąta jest interpolowana na podstawie jasności jego wierzchołków, tzw. cieniowanie Gourauda Jasność wnętrza wielokąta jest interpolowana na podstawie jasności jego wierzchołków, tzw. cieniowanie Gourauda

40 Cieniowanie Cieniowanie płaskie Cieniowanie płaskie Cieniowanie gładkie Cieniowanie gładkie

41 Komponenty składowe oświetlenia Światło otoczenia (ambient) Światło otoczenia (ambient) Światło rozproszone (diffuse) Światło rozproszone (diffuse) Światło odbite (specular) Światło odbite (specular)

42 Dokładność cieniowania a gęstość siatki

43 Tworzenie świateł Włączenie oświetlenia: glEnable(GL_LIGHTING); Włączenie oświetlenia: glEnable(GL_LIGHTING); Włączenie pierwszego światła: Włączenie pierwszego światła: glEnable(GL_LIGHT0); Kolejne światła mają identyfikatory i, gdzie i jest numerem światła np. Kolejne światła mają identyfikatory GL_LIGHT i, gdzie i jest numerem światła np. GL_LIGHT3 Do zmian parametrów światła służy funkcja Do zmian parametrów światła służy funkcja glLightfv Nowe parametry są pamiętane aż do kolejnej zmiany Nowe parametry są pamiętane aż do kolejnej zmiany

44 Parametry światła Składowa otoczenia (ambient) Składowa otoczenia (ambient) GLfloat light_ambient[] = { 0.1, 0.1, 0.1, 1.0 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); Składowa rozproszenia (diffuse) Składowa rozproszenia (diffuse) GLfloat light_diffuse[] = { 0.8, 0.8, 0.8, 1.0 }; glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); Składowa odbicia (specular) Składowa odbicia (specular) GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); Pozycja światła w przestrzeni Pozycja światła w przestrzeni GLfloat light_position[] = {-9.0, 5.0, 1.0, 1.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position);

45 Materiały Podstawowe parametry materiału, tak jak w przypadku świateł, to: ambient, diffuse i specular Podstawowe parametry materiału, tak jak w przypadku świateł, to: ambient, diffuse i specular Dodatkowo można określić: Dodatkowo można określić: Stopień gładkości powierzchni – shininessStopień gładkości powierzchni – shininess Świecenie własnym światłem - emissionŚwiecenie własnym światłem - emission

46 Parametry materiałów Do zmiany parametrów materiału służy funkcja Do zmiany parametrów materiału służy funkcja glMaterialfv Nowe parametry obowiązują dla wszystkich obiektów rysowanych po zmianie Materiał można określić osobno dla przedniej i tylniej ściany obiektu: GL_FRONT – przód, GL_BACK – tył, GL_FRONT_AND_BACK – dwie strony jednocześnie

47 Składnia funkcji Składnia funkcji glMaterialfv GLfloat mat_diff[] = { 0.1, 0.5, 0.8, 1.0 }; glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diff); nazwa param. wartość domyślna opis GL_AMBIENT(0.2, 0.2, 0.2, 1.0) światło otoczenia GL_DIFFUSE(0.8, 0.8, 0.8, 1.0) kolor rozproszenia GL_AMBIENT_AND_DIFFUSE rozpr. + otocz. GL_SPECULAR(0.0, 0.0, 0.0, 1.0) kolor odbicia lustrzanego GL_SHININESS0.0 gładkość powierzchni GL_EMISSION(0.0, 0.0, 0.0, 1.0) kolor świecenia

48 Stos macierzy Zależności hierarchiczne pomiędzy obiektami realizowane są za pomocą stosu macierzy Zależności hierarchiczne pomiędzy obiektami realizowane są za pomocą stosu macierzy OpenGL nie manipuluje bezpośrednio obiektami, jest to biblioteka która rysuje obiekty 3D OpenGL nie manipuluje bezpośrednio obiektami, jest to biblioteka która rysuje obiekty 3D To, gdzie zostanie narysowany obiekt zależy od bieżącej macierzy przekształcenia To, gdzie zostanie narysowany obiekt zależy od bieżącej macierzy przekształcenia Macierze można odkładać na stos macierzy i pobierać je z niego Macierze można odkładać na stos macierzy i pobierać je z niego glPushMatrix – odkłada macierz na stos glPushMatrix – odkłada macierz na stos glPopMatrix – pobiera macierz ze stosu glPopMatrix – pobiera macierz ze stosu

49 Użycie stosu macierzy glTranslatef(3,3,0); RysujNadwozie(); glPushMatrix(); glTranslatef(-1.5,-1.5,0); RysujKolo(); glPopMatrix(); glPushMatrix(); glTranslatef(1.5,-1.5,0); RysujKolo(); glPopMatrix(); glPushMatrix(); glTranslatef(-1.5,1.5,0); RysujKolo(); glPopMatrix(); glPushMatrix(); glTranslatef(1.5,1.5,0); RysujKolo();

50 Tekstury Teksturami są zwykle bitmapy, czyli tablice zawierające wartości kolorów pikseli Teksturami są zwykle bitmapy, czyli tablice zawierające wartości kolorów pikseli W kartach obsługujących tzw. shadery możliwe są tekstury proceduralne W kartach obsługujących tzw. shadery możliwe są tekstury proceduralne Standardowo tekstura powinna być kwadratem, którego długość boku jest potęgą 2 (w najnowszych kartach graficznych usunięto to ograniczenie) Standardowo tekstura powinna być kwadratem, którego długość boku jest potęgą 2 (w najnowszych kartach graficznych usunięto to ograniczenie)

51 Biblioteka pomocnicza Funkcje pomagające ładować tekstury znajdują się w bibliotece glaux Funkcje pomagające ładować tekstury znajdują się w bibliotece glaux Aby jej używać należy dołączyć do programu odpowiedni plik nagłówkowy: Aby jej używać należy dołączyć do programu odpowiedni plik nagłówkowy: #include W pliku projektu (NazwaProgramu.cpp) należy dodać wpis: USELIB("glaux.lib");

52 Ładowanie bitmapy z dysku Przygotowanie zmiennej przechowującej bitmapę: Przygotowanie zmiennej przechowującej bitmapę: AUX_RGBImageRec *TextureImage[1]; memset(TextureImage,0,sizeof(void *)*1); Ładowanie bitmapy z dysku: Ładowanie bitmapy z dysku: TextureImage[0]=auxDIBImageLoad('plik.bmp'); Tablica Tablica TextureImage może mieć dowolny rozmiar odpowiadający liczbie potrzebnych tekstur

53 Przygotowanie uchwytów Odwołanie do tekstury następuje poprzez uchwyt, będący liczbą Odwołanie do tekstury następuje poprzez uchwyt, będący liczbą Dla większej ilości tekstur (tutaj 3) można utworzyć tablicę: Dla większej ilości tekstur (tutaj 3) można utworzyć tablicę: GLuint texture[3]; Tablicę tą należy zainicjować: Tablicę tą należy zainicjować: glGenTextures(3, &texture[0]); Następnie należy wybrać teksturę aktywną: glBindTexture(GL_TEXTURE_2D, texture[0]);

54 Generowanie tekstury Generowanie tekstury Generowanie tekstury glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data); Operację należy powtórzyć dla wszystkich tekstur Operację należy powtórzyć dla wszystkich tekstur Po wygenerowaniu tekstura jest zwykle przechowywana w pamięci karty graficznej (jeśli jest miejsce) Po wygenerowaniu tekstura jest zwykle przechowywana w pamięci karty graficznej (jeśli jest miejsce) Bitmapa załadowana z dysku może zostać zwolniona: Bitmapa załadowana z dysku może zostać zwolniona: free(TextureImage[0]->data); free(TextureImage[0]); poziom MIPmap liczba składowych koloru

55 Nakładanie tekstury na obiekt Aktywacja tekstury: Aktywacja tekstury: glBindTexture(GL_TEXTURE_2D, texture[0]); Rysując obiekty, należy dla każdego wierzchołka określić współrzędne tekstury: Rysując obiekty, należy dla każdego wierzchołka określić współrzędne tekstury: glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glEnd();

56 Współrzędne tekstury tekstura rysowany czworokąt s t

57 Tekstury w 3D ściana tekstura teksturowana ściana

58 Filtracja tekstur Włączenie filtracji tekstur: glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR); bez filtracjifiltracja liniowa

59 Filtracja tekstur przy pomniejszaniu bez filtracjifiltracja liniowa

60 MIPmapping Technika na przygotowaniu wcześniej pomniejszonych i przefiltrowanych wersji tekstury Technika na przygotowaniu wcześniej pomniejszonych i przefiltrowanych wersji tekstury Nazwa pochodzi z łaciny od "multum in parvo" Nazwa pochodzi z łaciny od "multum in parvo" Poziom zerowy MIPmapy oznacza oryginalną teksturę Poziom zerowy MIPmapy oznacza oryginalną teksturę Każdy kolejny poziom jest o połowę pomniejszonym poziomem poprzednim (stąd ograniczenie na długość boku tekstury, który musi być potęgą 2) Każdy kolejny poziom jest o połowę pomniejszonym poziomem poprzednim (stąd ograniczenie na długość boku tekstury, który musi być potęgą 2)

61 MIPmapy reprezentacja prosta w pamięci karty graficznej

62 Działanie MIPmap bez filtracji z filtrem liniowym

63 Zasłanianie obiektów Technika bufora Z Technika bufora Z Bufor Z – bitmapa zawierająca głębię (odległość w głąb ekranu) każdego piksela w obrazie Bufor Z – bitmapa zawierająca głębię (odległość w głąb ekranu) każdego piksela w obrazie OpenGL oblicza oświetlenie dla wszystkich wielokątów OpenGL oblicza oświetlenie dla wszystkich wielokątów Przed zapisaniem piksela w określone miejsce porównywana jest jego wartość wsp. Z z wartością bufora Z o tych samych współrzędnych Przed zapisaniem piksela w określone miejsce porównywana jest jego wartość wsp. Z z wartością bufora Z o tych samych współrzędnych Jeśli piksel jest bliżej kamery niż zapisany poprzednio w tym miejscu, piksel jest rysowany a bufor Z jest aktualizowany na wartość Z nowego piksela Jeśli piksel jest bliżej kamery niż zapisany poprzednio w tym miejscu, piksel jest rysowany a bufor Z jest aktualizowany na wartość Z nowego piksela Jeśli nowy piksel jest dalej od kamery niż ten zapisany poprzednio, jego wartość jest ignorowana Jeśli nowy piksel jest dalej od kamery niż ten zapisany poprzednio, jego wartość jest ignorowana

64 Użyteczne linki Strona domowa standardu OpenGL: Strona domowa standardu OpenGL: Tutoriale dotyczące programowania: Tutoriale dotyczące programowania:


Pobierz ppt "Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL dr inż. Piotr Steć"

Podobne prezentacje


Reklamy Google