Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

description

Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL. dr inż. Piotr Steć. Czym jest OpenGL. Biblioteka programistyczna Interfejs pomiędzy sprzętem a programistą Uniezależnia programistę od platformy sprzętowej i programowej - PowerPoint PPT Presentation

Transcript of Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Page 1: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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ć

Page 2: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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.

Page 3: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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ń

Page 4: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 5: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 6: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 7: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 8: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Operacje na pikselachOperacje na pikselach

Pobieranie bitmap z pamięciPobieranie bitmap z pamięci Konwersja formatów pikseliKonwersja formatów pikseli SkalowanieSkalowanie FiltracjaFiltracja KopiowanieKopiowanie

Page 9: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 10: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 11: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 12: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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)

Page 13: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 14: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 15: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 16: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 17: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 18: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 19: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 20: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 21: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

ViewportViewport

Page 22: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Bryła obcinającaBryła obcinająca

Page 23: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 24: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 25: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Rysowanie trójkątówRysowanie trójkątów

1

2

3

4

5

6

Page 26: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Punkty i liniePunkty i linie

0

1

23

4

50

1

23

4

5

0

1

23

4

5

0

1

23

4

5

Page 27: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

WielokątyWielokąty

0

1 2

34

0

1 2

3

4

5

7

6

GL_POLYGON GL_QUADS

Page 28: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Rysowanie pasów trójkątówRysowanie pasów trójkątów

glBegin(GL_TRIANGLE_STRIP);

1

2

3

4

5

6

7

Page 29: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 30: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 31: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 32: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 33: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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)

Page 34: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Macierz jednostkowaMacierz jednostkowa

Macierz oznaczająca brak Macierz oznaczająca brak przekształceńprzekształceń

glLoad Identity();glLoad Identity();

1000

0100

0010

0001

M

Page 35: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 36: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 37: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 38: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 39: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Ś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

Page 40: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

CieniowanieCieniowanie

Cieniowanie Cieniowanie płaskiepłaskie

Cieniowanie Cieniowanie gładkiegładkie

Page 41: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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)

Page 42: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Dokładność cieniowania a gęstość Dokładność cieniowania a gęstość siatkisiatki

16 24

36 100

Page 43: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 44: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 45: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 46: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 47: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 48: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 49: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 50: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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)

Page 51: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 52: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Ł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

Page 53: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 54: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 55: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 56: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Współrzędne teksturyWspółrzędne teksturytekstura

rysowanyczworokąt

s

t

0 10

1

Page 57: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Tekstury w 3DTekstury w 3D

ścianatekstura

teksturowanaściana

Page 58: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 59: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Filtracja tekstur przy pomniejszaniuFiltracja tekstur przy pomniejszaniu

bez filtracji filtracja liniowa

Page 60: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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)

Page 61: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

MIPmapyMIPmapy

reprezentacja prostaw pamięci

karty graficznej

Page 62: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

Działanie MIPmapDziałanie MIPmap

bez filtracji z filtrem liniowym

Page 63: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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

Page 64: Podstawy programowania grafiki 3D z użyciem biblioteki OpenGL

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/