Podstawy programowania Podstawy programowania grafiki 3D z użyciem grafiki 3D z użyciem biblioteki OpenGLbiblioteki OpenGL
dr inż. Piotr Stećdr inż. Piotr Steć
Czym jest OpenGLCzym jest OpenGL
Biblioteka programistycznaBiblioteka programistyczna Interfejs pomiędzy sprzętem a programistąInterfejs pomiędzy sprzętem a programistą Uniezależnia programistę od platformy Uniezależnia programistę od platformy
sprzętowej i programowejsprzętowej i programowej Bazuje na bibliotece Iris GL opracowanej Bazuje na bibliotece Iris GL opracowanej
przez Silicon Graphicsprzez Silicon Graphics Wszystkie nowoczesne karty graficzne Wszystkie nowoczesne karty graficzne
wspierają sprzętowo funkcje OpenGLwspierają sprzętowo funkcje OpenGL Pierwsza wersja powstała w 1992r.Pierwsza wersja powstała w 1992r.
Zalety OpenGLZalety OpenGL
Całkowite uniezależnienie od możliwości Całkowite uniezależnienie od możliwości karty graficznejkarty graficznej
Prosty i przejrzysty kod programuProsty i przejrzysty kod programu Program wygląda prawie tak samo we Program wygląda prawie tak samo we
wszystkich językach programowania i na wszystkich językach programowania i na wszystkich platformach systemowychwszystkich platformach systemowych
Biblioteka jest darmowa i można jej Biblioteka jest darmowa i można jej używać we własnych programach bez używać we własnych programach bez ograniczeńograniczeń
Jak działa OpenGLJak działa OpenGLDane
wierzchołków
Danepikseli
Listawyświetlania
Buforramki
Ewaluacja
Rasteryzacja
Operacje na
pikselachTworzenie
tekstur
Operacje
na fragmentach
Operacje nawierzchołkach
i budowanieprymitywów
Schemat potoku renderującego
Listy wyświetlaniaListy wyświetlania
Dwa tryby pracy OpenGL:Dwa tryby pracy OpenGL:• immediate modeimmediate mode – komendy graficzne – komendy graficzne
wykonywane są natychmiastwykonywane są natychmiast• retained moderetained mode – komendy graficzne – komendy graficzne
przechowywane są w listach przechowywane są w listach Listy mogą być wielokrotnie Listy mogą być wielokrotnie
wykonywanewykonywane
EwaluacjaEwaluacja
Blok ten przekształca dane sterujące Blok ten przekształca dane sterujące na parametry i współrzędne na parametry i współrzędne przestrzenneprzestrzenne
Może generować:Może generować:• Powierzchnie NURBSPowierzchnie NURBS• Mapowanie teksturMapowanie tekstur• Wektory normalneWektory normalne• Informację o kolorzeInformację o kolorze
Operacje na wierzchołkach i budowanie prymitywów
Wierzchołki obiektów poddawane są Wierzchołki obiektów poddawane są transformacjomtransformacjom
Obiekty 3D są rzutowane na Obiekty 3D są rzutowane na płaszczyznę 2D (ekran)płaszczyznę 2D (ekran)
Obcinane są niewidoczne części Obcinane są niewidoczne części obiektówobiektów
Obliczane jest oświetlenie obiektówObliczane jest oświetlenie obiektów
Operacje na pikselachOperacje na pikselach
Pobieranie bitmap z pamięciPobieranie bitmap z pamięci Konwersja formatów pikseliKonwersja formatów pikseli SkalowanieSkalowanie FiltracjaFiltracja KopiowanieKopiowanie
Tworzenie teksturTworzenie tekstur
Tworzenie tekstur z bitmapTworzenie tekstur z bitmap Łączenie wielu bitmap w tekstur꣹czenie wielu bitmap w teksturę Organizacja pamięci teksturOrganizacja pamięci tekstur Generowanie MIPMapGenerowanie MIPMap Filtracja teksturFiltracja tekstur
RasteryzacjaRasteryzacja
Zamiana danych wektorowych, Zamiana danych wektorowych, parametrów oświetlenia i materiałów na parametrów oświetlenia i materiałów na tzw. tzw. fragmenty:fragmenty:• wierzchołki łączone są liniamiwierzchołki łączone są liniami• wielokąty są wypełniane z uwzględnieniem wielokąty są wypełniane z uwzględnieniem
cieniowaniacieniowania Fragment jest surowym odpowiednikiem Fragment jest surowym odpowiednikiem
pikselapiksela, czyli jednego punktu na ekranie, czyli jednego punktu na ekranie Fragment zwykle zawiera więcej informacji Fragment zwykle zawiera więcej informacji
niż piksel, np. głębię czy wartości buforów niż piksel, np. głębię czy wartości buforów specjalnychspecjalnych
Operacje na fragmentachOperacje na fragmentach
TeksturowanieTeksturowanie Obliczanie wartości mgłyObliczanie wartości mgły Mieszanie z buforem alfaMieszanie z buforem alfa Uwzględnianie szablonówUwzględnianie szablonów Operacje na buforze ZOperacje na buforze Z Operacje logiczneOperacje logiczne Wynik końcowy: piksel zapisany do Wynik końcowy: piksel zapisany do
bufora ramkibufora ramki
Bufor ramkiBufor ramki Pamięć przechowująca piksele, które mają być Pamięć przechowująca piksele, które mają być
wyświetlone na ekraniewyświetlone na ekranie Wielkość bufora ramki zależy od wielkości okna w Wielkość bufora ramki zależy od wielkości okna w
którym wyświetlana jest grafikaktórym wyświetlana jest grafika OpenGL może obsługiwać wiele buforów ramkiOpenGL 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 Jeden jest wyświetlany (front), drugi jest używany do rysowania (back)rysowania (back)
• Po zakończeniu rysowania bufory zamieniane są Po zakończeniu rysowania bufory zamieniane są miejscami (podwójne buforowanie)miejscami (podwójne buforowanie)
W przypadku wyświetlania stereo, stosowane są 4 W przypadku wyświetlania stereo, stosowane są 4 bufory (po 2 na jedno oko)bufory (po 2 na jedno oko)
Składnia komend OpenGLSkładnia komend OpenGL
Wszystkie komendy rozpoczynają się Wszystkie komendy rozpoczynają się przedrostkiem przedrostkiem gl gl np. np. glClearColor()glClearColor()
Wszystkie stałe rozpoczynają się Wszystkie stałe rozpoczynają się przedrostkiem przedrostkiem GL_GL_, np. , np. GL_FRONTGL_FRONT
Komendy są tworzone według Komendy są tworzone według jednego schematu:jednego schematu:
glColor3f(biblioteka
komenda
typ parametrówliczba
parametrów
Przyrostki komend i typy Przyrostki komend i typy parametrówparametrów
PrzyrostekPrzyrostek Typ danychTyp danych nazwa w Cnazwa w C Definicja w Definicja w OpenGLOpenGL
bb 8-bit. liczba czałk.8-bit. liczba czałk. signed charsigned char GLbyteGLbyte
ss 16-bit. liczba 16-bit. liczba czałk.czałk.
shortshort GLshortGLshort
ii 32-bit. liczba 32-bit. liczba czałk.czałk.
intint GLint, GLsizeiGLint, GLsizei
ff 32-bit. liczba 32-bit. liczba zmiennopozyc.zmiennopozyc.
floatfloat GLfloatGLfloat
dd 64-bit. liczba 64-bit. liczba zmiennopozyc.zmiennopozyc.
doubledouble GLdoubleGLdouble
np. glVertex2i(33,150); glvertex3f(12.34,100.1,0.5);
Szkielet programuSzkielet programu
1.1. Inicjalizacja bibliotekiInicjalizacja biblioteki
2.2. Ustalenie wielkości okna i typu Ustalenie wielkości okna i typu kamerykamery
3.3. Opcjonalnie: zmiana parametrów Opcjonalnie: zmiana parametrów kamery i zmiennych środowiskakamery i zmiennych środowiska
4.4. Rysowanie obiektówRysowanie obiektów
5.5. Jeśli nie koniec, to skok do 3Jeśli nie koniec, to skok do 3
6.6. Zwalnianie zasobówZwalnianie zasobów
Pliki nagłówkowePliki nagłówkowe W bibliotekach używających OpenGL W bibliotekach używających OpenGL
należy podłączyć odpowiednie pliki należy podłączyć odpowiednie pliki nagłówkowenagłówkowe#include <GL/gl.h> #include <GL/gl.h> #include <GL/glu.h>#include <GL/glu.h>
Opcjonalnie można użyć pomocniczej Opcjonalnie można użyć pomocniczej bibliotekibiblioteki#include <gl/glaux.h>#include <gl/glaux.h>
Biblioteka Biblioteka glauxglaux nie jest częścią nie jest częścią standardu, jest nieoficjalna i nie jest standardu, jest nieoficjalna i nie jest standardowo dostępna. Należy standardowo dostępna. Należy samodzielnie zdobyć plik samodzielnie zdobyć plik glaux.libglaux.lib
Kontekst urządzeniaKontekst urządzenia Kontekst urządzenia pod Windows pozwala na Kontekst urządzenia pod Windows pozwala na
rysowanierysowanie Ogólnie jest to ten element okna, który widzimy Ogólnie jest to ten element okna, który widzimy
na ekranie (ale można uzyskać kontekst na ekranie (ale można uzyskać kontekst urządzenia również dla elementów urządzenia również dla elementów niewidocznych)niewidocznych)
Globalna zmienna przechowująca kontekst:Globalna zmienna przechowująca kontekst:HDC hdc;HDC hdc;
Pobieranie kontekstu w czasie inicjalizacji:Pobieranie kontekstu w czasie inicjalizacji:hdc=GetDC(Handle);hdc=GetDC(Handle);
Zwalnianie kontekstu na końcu programu:Zwalnianie kontekstu na końcu programu:ReleseDC(Handle, hdc);ReleseDC(Handle, hdc);
Format pikselaFormat piksela Format piksela jest niezależny od aktualnego trybu Format piksela jest niezależny od aktualnego trybu
kolorówkolorów
PIXELFORMATDESCRIPTOR pfd; PIXELFORMATDESCRIPTOR pfd; ZeroMemory( &pfd, sizeof( pfd ) ); ZeroMemory( &pfd, sizeof( pfd ) ); pfd.nSize = sizeof( pfd ); pfd.nSize = sizeof( pfd ); pfd.nVersion = 1; pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cColorBits = 24; pfd.cDepthBits = 16; pfd.cDepthBits = 16;
int iFormat = ChoosePixelFormat( hDC, &pfd ); int iFormat = ChoosePixelFormat( hDC, &pfd ); SetPixelFormat( hDC, iFormat, &pfd );SetPixelFormat( hDC, iFormat, &pfd );
Kontekst renderinguKontekst renderingu Jest dla OpenGL tym samym, czym jest kontekst Jest dla OpenGL tym samym, czym jest kontekst
urządzenia dla Windowsurządzenia dla Windows Globalna zmienna przechowująca identyfikator:Globalna zmienna przechowująca identyfikator:HGLRC hRC;HGLRC hRC;
Tworzenie kontekstu (można utworzyć kilka):Tworzenie kontekstu (można utworzyć kilka):hRC = wglCreateContext( hDC );hRC = wglCreateContext( hDC );
Wybieranie aktywnego kontekstu:Wybieranie aktywnego kontekstu:wglMakeCurrent( hDC, hRC );wglMakeCurrent( hDC, hRC );
Zwalnianie kontekstu na końcu programu:Zwalnianie kontekstu na końcu programu:wglMakeCurrent( NULL, NULL ); wglMakeCurrent( NULL, NULL ); wglDeleteContext( hRC );wglDeleteContext( hRC );
Parametry wyświetlaniaParametry wyświetlania
Obszar okna, na którym będzie rysowana Obszar okna, na którym będzie rysowana scena: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);
ViewportViewport
Bryła obcinającaBryła obcinająca
Rysowanie obiektówRysowanie 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ć Kolor czyszczący bufor można ustalić dowolnie funkcją (przed rysowaniem):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);
Rysowanie obiektów c.d.Rysowanie obiektów c.d. Narysowanie trójkąta (dowolna ilość komend Narysowanie trójkąta (dowolna ilość komend glVertexglVertex):):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 ramkiZamiana buforów ramkiSwapBuffers( _hdc ); //za
Rysowanie trójkątówRysowanie trójkątów
1
2
3
4
5
6
Punkty i liniePunkty i linie
0
1
23
4
50
1
23
4
5
0
1
23
4
5
0
1
23
4
5
WielokątyWielokąty
0
1 2
34
0
1 2
3
4
5
7
6
GL_POLYGON GL_QUADS
Rysowanie pasów trójkątówRysowanie pasów trójkątów
glBegin(GL_TRIANGLE_STRIP);
1
2
3
4
5
6
7
Pasy czworokątów Pasy czworokątów i wachlarze trójkątówi wachlarze trójkątów
0
1
2
3
4
5
7
6 1
23
4
5
GL_QUAD_STRIP GL_TRINGLE_FAN
Kolory w OpenGLKolory w OpenGL Kolor najczęściej jest podawany w postaci Kolor najczęściej jest podawany w postaci
składowych RGB lub RGBA, gdzie A określa składowych RGB lub RGBA, gdzie A określa przeźroczystośćprzeźroczystość
Każda składowa przyjmuje wartości z zakresu <0, Każda składowa przyjmuje wartości z zakresu <0, 1>1>
Taka reprezentacja jest niezależna od bieżącego Taka reprezentacja jest niezależna od bieżącego trybu kolorówtrybu kolorów
Kolor zmieniany jest komendą Kolor zmieniany jest komendą glColorglColor np. np. glColor3d( 1.0, 0.0, 0.0 ); (czerwony)
Raz ustawiony kolor obowiązuje dla wszystkich Raz ustawiony kolor obowiązuje dla wszystkich rysowanych po zmianie obiektówrysowanych po zmianie obiektów
Współrzędne jednorodneWspółrzędne jednorodne
Punkt w przestrzeni reprezentowany jest Punkt w przestrzeni reprezentowany jest przez przez czterycztery współrzędne (x,y,z,w) współrzędne (x,y,z,w)
Wsp. jednorodne reprezentują ten sam Wsp. jednorodne reprezentują ten sam punkt wtedy, gdy jeden zestaw jest punkt wtedy, gdy jeden zestaw jest wielokrotnością drugiego, np. (2,1,1,4) i wielokrotnością drugiego, np. (2,1,1,4) i (4,2,2,8)(4,2,2,8)
Przynajmniej jedna ze współrzędnych Przynajmniej jedna ze współrzędnych musi być różna od zera (musi być różna od zera ((0,0,0,0) – (0,0,0,0) – niedopuszczalneniedopuszczalne))
Przekształcenia 3DPrzekształcenia 3D Translacja Translacja glTranslatef(-1.5f,0.0f,-6.0f);
Skalowanie Skalowanie glScale(2.5f,1.0f,0.5f);
1000
100
010
001
z
y
x
d
d
d
T
1000
000
000
000
z
y
x
s
s
s
S
Obroty 3DObroty 3D
1000
0cossin0
0sincos0
0001
xR
1000
0cos0sin
0010
0sin0cos
yR
1000
0100
00cossin
00sincos
xR
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)
Macierz jednostkowaMacierz jednostkowa
Macierz oznaczająca brak Macierz oznaczająca brak przekształceńprzekształceń
glLoad Identity();glLoad Identity();
1000
0100
0010
0001
M
Składanie przekształceńSkładanie przekształceń
OpenGL przechowuje przekształcenia w OpenGL przechowuje przekształcenia w postaci macierzypostaci macierzy
Wywoływanie funkcji Wywoływanie funkcji glTranslate, glRotate, glScale powoduje mnożenie powoduje mnożenie bieżącej macierzy, przez macierz bieżącej macierzy, przez macierz odpowiedniego przekształceniaodpowiedniego przekształcenia
Przekształcenie musi być dokonane Przekształcenie musi być dokonane przedprzed narysowaniem obiektunarysowaniem obiektu
Przykład przekształceń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();
Wektory normalneWektory normalne
Wektor normalny jest to wektor Wektor normalny jest to wektor prostopadły do danej powierzchniprostopadły do danej powierzchni
Wektory krawędziowe:Wektory krawędziowe:2
0
1
V10
V12
2112
2112
2112
0110
0110
0110
zzz
yyy
xxx
zzz
yyy
xxx
Wektory normalne c.d.Wektory normalne c.d.
Wektor normalny można uzyskać mnożąc Wektor normalny można uzyskać mnożąc wektorowo dwa wektory krawędziowewektorowo dwa wektory krawędziowe
Zwykle wektory normalne muszą być Zwykle wektory normalne muszą być znormalizowane, czyli muszą mieć znormalizowane, czyli muszą mieć długość 1długość 1
101212101210101210121210
121212101010
,,
,,,,
yxyxzxzxzyzy
zyxzyxn
222
,,
zyx
zyx
n
nnn
ŚwiatłoŚwiatło
Oświetlenie jest obliczane dla Oświetlenie jest obliczane dla każdego wierzchołka obiektukażdego wierzchołka obiektu
Aby można było obliczyć wartość Aby można było obliczyć wartość oświetlenia, oświetlenia, musimusi być podany wektor być podany wektor normalny dla wierzchołkanormalny dla wierzchołka
Jasność wnętrza wielokąta jest Jasność wnętrza wielokąta jest interpolowana na podstawie jasności interpolowana na podstawie jasności jego wierzchołków, tzw. jego wierzchołków, tzw. cieniowanie cieniowanie Gouraud’aGouraud’a
CieniowanieCieniowanie
Cieniowanie Cieniowanie płaskiepłaskie
Cieniowanie Cieniowanie gładkiegładkie
Komponenty składowe oświetleniaKomponenty składowe oświetlenia
Światło otoczenia Światło otoczenia (ambient)(ambient)
Światło Światło rozproszone rozproszone (diffuse)(diffuse)
Światło odbite Światło odbite (specular)(specular)
Dokładność cieniowania a gęstość Dokładność cieniowania a gęstość siatkisiatki
16 24
36 100
Tworzenie światełTworzenie świateł Włączenie oświetlenia:Włączenie oświetlenia:glEnable(GL_LIGHTING);glEnable(GL_LIGHTING);
Włączenie pierwszego światła:Włączenie pierwszego światła:glEnable(GL_LIGHT0);
Kolejne światła mają identyfikatoryKolejne światła mają identyfikatoryGL_LIGHTii, gdzie, gdzie i i jest numerem światła jest numerem światła np. np. GL_LIGHT3
Do zmian parametrów światła służy Do zmian parametrów światła służy funkcja funkcja glLightfv
Nowe parametry są pamiętane aż do Nowe parametry są pamiętane aż do kolejnej zmianykolejnej zmiany
Parametry światłaParametry ś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 przestrzeniPozycja światła w przestrzeniGLfloat light_position[] = {-9.0, 5.0, 1.0, 1.0 };glLightfv(GL_LIGHT0, GL_POSITION, light_position);
MateriałyMateriały
Podstawowe parametry materiału, Podstawowe parametry materiału, tak jak w przypadku świateł, to: tak jak w przypadku świateł, to: ambient, diffuse i specularambient, diffuse i specular
Dodatkowo można określić:Dodatkowo można określić:• Stopień gładkości powierzchni – Stopień gładkości powierzchni –
shininessshininess• Świecenie własnym światłem - Świecenie własnym światłem -
emissionemission
Parametry materiałówParametry materiałów
Do zmiany parametrów materiału służy Do zmiany parametrów materiału służy funkcja 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
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.nazwa param. wartość domyślnawartość domyślna opisopis
GL_AMBIENT (0.2, 0.2, 0.2, 1.0) światło światło otoczeniaotoczenia
GL_DIFFUSE (0.8, 0.8, 0.8, 1.0) kolor kolor rozproszeniarozproszenia
GL_AMBIENT_AND_DIFFUSE rozpr. + otocz.rozpr. + otocz.
GL_SPECULAR (0.0, 0.0, 0.0, 1.0) kolor odbicia kolor odbicia lustrzanegolustrzanego
GL_SHININESS 0.0 gładkość gładkość powierzchnipowierzchni
GL_EMISSION (0.0, 0.0, 0.0, 1.0) kolor świeceniakolor świecenia
Stos macierzyStos macierzy Zależności hierarchiczne pomiędzy obiektami Zależności hierarchiczne pomiędzy obiektami
realizowane są za pomocą stosu macierzyrealizowane są za pomocą stosu macierzy OpenGL OpenGL nie manipulujenie manipuluje bezpośrednio bezpośrednio
obiektami, jest to biblioteka która obiektami, jest to biblioteka która rysujerysuje obiekty obiekty 3D3D
To, gdzie zostanie narysowany obiekt zależy od To, gdzie zostanie narysowany obiekt zależy od bieżącej bieżącej macierzy przekształceniamacierzy przekształcenia
Macierze można odkładać na Macierze można odkładać na stos macierzystos macierzy i i pobierać je z niegopobierać je z niego
glPushMatrixglPushMatrix – odkłada macierz na stos – odkłada macierz na stos glPopMatrixglPopMatrix – pobiera macierz ze stosu – pobiera macierz ze stosu
Użycie stosu macierzyUżycie stosu macierzyglTranslatef(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();
TeksturyTekstury
Teksturami są zwykle bitmapy, czyli Teksturami są zwykle bitmapy, czyli tablice zawierające wartości kolorów tablice zawierające wartości kolorów pikselipikseli
W kartach obsługujących tzw. shader’y W kartach obsługujących tzw. shader’y możliwe są tekstury proceduralnemożliwe są tekstury proceduralne
Standardowo tekstura powinna być Standardowo tekstura powinna być kwadratem, którego długość boku jest kwadratem, którego długość boku jest potęgą 2 (w najnowszych kartach potęgą 2 (w najnowszych kartach graficznych usunięto to ograniczenie)graficznych usunięto to ograniczenie)
Biblioteka pomocniczaBiblioteka pomocnicza
Funkcje pomagające ładować tekstury Funkcje pomagające ładować tekstury znajdują się w bibliotece glauxznajdują się w bibliotece glaux
Aby jej używać należy dołączyć do Aby jej używać należy dołączyć do programu odpowiedni plik nagłówkowy:programu odpowiedni plik nagłówkowy:#include <GL\glaux.h>
W pliku projektu (NazwaProgramu.cpp) należy dodać wpis:USELIB("glaux.lib");
Ładowanie bitmapy z dyskuŁadowanie bitmapy z dysku
Przygotowanie zmiennej Przygotowanie zmiennej przechowującej bitmapę: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
Przygotowanie uchwytówPrzygotowanie uchwytów
Odwołanie do tekstury następuje poprzez Odwołanie do tekstury następuje poprzez uchwyt, będący liczbąuchwyt, będący liczbą
Dla większej ilości tekstur (tutaj 3) można Dla większej ilości tekstur (tutaj 3) można utworzyć tablicę: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]);
Generowanie teksturyGenerowanie tekstury Generowanie teksturyGenerowanie 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 teksturOperację należy powtórzyć dla wszystkich tekstur Po wygenerowaniu tekstura jest zwykle Po wygenerowaniu tekstura jest zwykle
przechowywana w pamięci karty graficznej (jeśli przechowywana w pamięci karty graficznej (jeśli jest miejsce)jest miejsce)
Bitmapa załadowana z dysku może zostać Bitmapa załadowana z dysku może zostać zwolniona:zwolniona:free(TextureImage[0]->data);free(TextureImage[0]);
poziom MIPmap
liczba składowych
koloru
Nakładanie tekstury na obiektNakładanie tekstury na obiekt Aktywacja tekstury:Aktywacja tekstury:glBindTexture(GL_TEXTURE_2D, texture[0]);
Rysując obiekty, należy dla każdego wierzchołka Rysując obiekty, należy dla każdego wierzchołka określić współrzędne tekstury: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();
Współrzędne teksturyWspółrzędne teksturytekstura
rysowanyczworokąt
s
t
0 10
1
Tekstury w 3DTekstury w 3D
ścianatekstura
teksturowanaściana
Filtracja teksturFiltracja 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 filtracji filtracja liniowa
Filtracja tekstur przy pomniejszaniuFiltracja tekstur przy pomniejszaniu
bez filtracji filtracja liniowa
MIPmappingMIPmapping Technika na przygotowaniu wcześniej Technika na przygotowaniu wcześniej
pomniejszonych i przefiltrowanych wersji pomniejszonych i przefiltrowanych wersji teksturytekstury
Nazwa pochodzi z łaciny od "multum in Nazwa pochodzi z łaciny od "multum in parvo"parvo"
Poziom zerowy MIPmapy oznacza Poziom zerowy MIPmapy oznacza oryginalną teksturęoryginalną teksturę
Każdy kolejny poziom jest o połowę Każdy kolejny poziom jest o połowę pomniejszonym poziomem poprzednim pomniejszonym poziomem poprzednim (stąd ograniczenie na długość boku (stąd ograniczenie na długość boku tekstury, który musi być potęgą 2)tekstury, który musi być potęgą 2)
MIPmapyMIPmapy
reprezentacja prostaw pamięci
karty graficznej
Działanie MIPmapDziałanie MIPmap
bez filtracji z filtrem liniowym
Zasłanianie obiektówZasłanianie obiektów Technika bufora ZTechnika bufora Z Bufor Z – bitmapa zawierająca głębię (odległość w Bufor Z – bitmapa zawierająca głębię (odległość w
głąb ekranu) każdego piksela w obraziegłąb ekranu) każdego piksela w obrazie OpenGL oblicza oświetlenie dla OpenGL oblicza oświetlenie dla wszystkichwszystkich
wielokątówwielokątów Przed zapisaniem piksela w określone miejsce Przed zapisaniem piksela w określone miejsce
porównywana jest jego wartość wsp. Z z wartością porównywana jest jego wartość wsp. Z z wartością bufora Z o tych samych współrzędnychbufora Z o tych samych współrzędnych
Jeśli piksel jest bliżej kamery niż zapisany Jeśli piksel jest bliżej kamery niż zapisany poprzednio w tym miejscu, piksel jest rysowany a poprzednio w tym miejscu, piksel jest rysowany a bufor Z jest aktualizowany na wartość Z nowego bufor Z jest aktualizowany na wartość Z nowego pikselapiksela
Jeśli nowy piksel jest dalej od kamery niż ten Jeśli nowy piksel jest dalej od kamery niż ten zapisany poprzednio, jego wartość jest ignorowanazapisany poprzednio, jego wartość jest ignorowana
Użyteczne linkiUżyteczne linki
Strona domowa standardu OpenGL:Strona domowa standardu OpenGL: http://www.opengl.orghttp://www.opengl.org
Tutoriale dotyczące programowania:Tutoriale dotyczące programowania:http://nehe.gamedev.net/http://nehe.gamedev.net/
Top Related