GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Bartosz Bazyluk GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL Grafika komputerowa i wizualizacja, Bioinformatyka S1, II Rok OpenGL ● ● ● ...
22 downloads 0 Views 2MB Size
Bartosz Bazyluk

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Grafika komputerowa i wizualizacja, Bioinformatyka S1, II Rok

OpenGL







Open Graphics Library Jest to API pozwalające na renderowanie grafiki w czasie rzeczywistym, zorientowane na wykorzystanie akceleracji sprzętowej OpenGL nie jest biblioteką ●







Jest to specyfikacja interfejsu programowania (API) Bibliotekami są implementacje OpenGL na konkretne platformy, dostarczane przez producentów sprzętu, systemów operacyjnych itp.

Jednym z głównych celów OpenGL jest wieloplatformowość Konkurencją jest Microsoft Direct3D z DirectX

11.04.13

Bartosz Bazyluk

2

OpenGL



OpenGL opisuje zbiór funkcji i numerycznych stałych, pozwalających na renderowanie grafiki ●

Nie obejmuje procedur obsługi wejścia, czy integracji z systemem operacyjnym w celu utworzenia kontekstu –



Istnieją multiplatformowe biblioteki dedykowane dla OpenGL, które rozwiązują te problemy: np. GLUT (freeglut), GLFW

Założeniem jest, że implementacja OpenGL opiera się głównie na procedurach sprzętowych ●



11.04.13

Operacje wykonywane bezpośrednio przez kartę graficzną, a nie software'owe rozwiązania oparte o CPU Wiele z oferowanych możliwości, jeśli nie są zaimplementowane w procedurach sprzętowych, może być emulowanych na CPU

Bartosz Bazyluk

3

OpenGL



Historia ●

1992 – OpenGL 1.0 wydany przez Sillicon Graphics (SGI)



1997-2003 – rozszerzenia OpenGL 1.x









2004 – OpenGL 2.0, zorientowany na programowalny potok renderowania (shadery, GLSL) 2006 – OpenGL rozwijany jest przez non-profitową organizację Khronos Group 2008 – OpenGL 3.0, znaczne ograniczenie API, usunięcie archaicznych podejść



2010 – OpenGL 4.0, odpowiednik DirectX 11 (np. teselacja)



2012 – OpenGL 4.3, aktualna wersja

OpenGL ES ●



11.04.13

Podzbiór standardu OpenGL, przeznaczony do implementacji na urządzeniach mobilnych OpenGL ES 3.0 – wersja najbardziej aktualna (2012), kopmpatybilna z OpenGL 4.3

Bartosz Bazyluk

4

OpenGL



Uproszczony schemat wykorzystania OpenGL w programowaniu grafiki czasu rzeczywistego

Program

Nasz program

11.04.13

OpenGL

Implementacja OpenGL dla danej platformy

Sterownik, OS

Sprzęt

System operacyjny

Karta graficzna

Bartosz Bazyluk

5

OpenGL



Architektura wykorzystania OpenGL jako warstwy pośredniej pomiędzy aplikacją, a kartą graficzną opiera się o model klient-serwer ●

Specyfikacja OpenGL wcale nie wymaga, aby obie strony znajdowały się w jednej, fizycznej maszynie!

Serwer

Klient

(implementacja OpenGL)

(program)

Zlecenia renderowania ● Opis sceny ● Używa pamięci głównej ● Logika programu Użycie wynikowego obrazu ●



11.04.13

Bartosz Bazyluk

Konteksty ● Renderowanie ● Komunikacja ze sterownikiem ● Dostęp do GPU i pamięci graficznej ●

6

OpenGL



Działanie OpenGL należy rozumieć jako maszynę stanu ●



Stanem nazywamy aktualne, chwilowe wartości wszystkich parametrów systemu

Jeśli zmienimy wartość jakiegoś parametru, pozostaje ona zmieniona do czasu kolejnej zmiany ●

11.04.13

Przykład: Jeśli zaczniemy w jednej klatce rysować czerwony prostokąt, wszystkie następne obiekty będą czerwone jeśli nie dokonamy zmiany koloru. Nawet w następnej klatce!

Bartosz Bazyluk

7

OpenGL



Układ współrzędnych w OpenGL ●

Trzeba zapamiętać albo mieć pod ręką!

+y

+x +z



11.04.13

Jednostki są zupełnie arbitralne, można przyjąć np. że jedna jednostka to 1 metr (albo 13 cm, albo 2 ft, albo...)

Bartosz Bazyluk

8

GLUT



GL Utility Toolkit ●





Freeglut jest open-source'owym klonem, z którego będziemy korzystać (w pełni kompatybilny z GLUT)

Dostarcza m.in.: ●



Biblioteka narzędziowa do OpenGL

Międzyplatformową obsługę urządzeń wejścia (mysz, klawiatura)



Łatwe tworzenie okien z kontekstem OpenGL



Procedury rysowania prostych brył (sześcian, kula itd.)



Implementację pętli głównej (mainloop/gameloop)

Wykorzystuje ideę callbacków, czyli funkcji obsługujących zdarzenia ●



11.04.13

W ten sposób programista ma możliwość reakcji na zdarzenia Przypisanie callbacka odbywa się poprzez wywołanie specjalnej funkcji ustawiającej, z wskaźnikiem do funkcji obsługującej zdarzenie jako parametr Bartosz Bazyluk

9

Przykładowy program

int main(int argc, char * argv[]) { glutInit(&argc, argv); glutInitWindowSize(640, 360); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("OpenGL/GLUT Example"); glutDisplayFunc(OnRender); glutMainLoop(); return 0; } void OnRender() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0f, 0.0f, -6.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); glColor3f(1.0f, 0.0f, 0.0f); glutSolidCube(1.0f); glutSwapBuffers(); glFlush(); glutPostRedisplay(); } 11.04.13

Bartosz Bazyluk

10

Programowanie z użyciem OpenGL



Nazwy funkcji OpenGL: ●

glNazwaFunkcjiparam(...) –

param – jeśli dana funkcja może przyjmować różne rodzaje parametrów, w ten sposób określany jest rodzaj tych parametrów oraz ich liczba, np.: ●





f – float, d – double, i – int, b – bool itd.



v – vector (tablica)

glNazwaFunkcjiEXT(...), glNazwaFunkcjiARB(...) –

Funkcjonalności pochodzące z rozszerzeń niebędących częścią standardu. Niektóre z nich w późniejszych wersjach OpenGL przestają posiadać sufiksy EXT i ARB. ●



glVertex3f(float x, float y, float z) glVertex3fv(float *xyz) glVertex2f(float x, float y) glVertex3d(double x, double y, double z) glVertex2i(int x, int y) ...

Do obsługi rozszerzeń warto użyć biblioteki GLEW

Nazwy funkcji GLU oraz GLUT: ●

11.04.13

gluNazwaFunkcji(...), glutNazwaFunkcji(...)

Bartosz Bazyluk

11

Transformacje w OpenGL



Częścią stanu OpenGL są dwie podstawowe macierze transformacji: ●

Macierz Modelu-Widoku (GL_MODELVIEW) –

Łączy w sobie przekształcenia związane zarówno z przejściem ze współrzędnych modelu do współrzędnych świata, jak i ze współrzędnych świata do współrzędnych kamery ●



Macierz Projekcji (GL_PROJECTION) –



Czyli uwzględnia zarówno przekształcenie konkretnego obiektu na scenie, jak i położenie i obrót kamery

Uwzględnia rodzaj projekcji (perspektywiczna/prostokątna), kąt widzenia, płaszczyzny przycinania, proporcje.

Tylko jedna z tych macierzy jest w danym momencie edytowalna ●

Wyboru aktualnie edytowanej macierzy dokonuje się za pomocą funkcji glMatrixMode(matrix) –

11.04.13

matrix – GL_MODELVIEW lub GL_PROJECTION

Bartosz Bazyluk

12

Transformacje w OpenGL



Umiejscowienie macierzy transformacji w potoku przetwarzania geometrii Współrzędne modelu Macierz modelu Współrzędne świata

GL_MODELVIEW Macierz widoku

Współrzędne kamery Macierz projekcji Współrzędne projekcji Kanoniczna bryła widzenia

Normalizacja, przycinanie itp.

GL_PROJECTION

Zazwyczaj poza bezpośrednią kontrolą

Mapowanie na ekran Współrzędne ekranu

11.04.13

Bartosz Bazyluk

13

Transformacje w OpenGL



Aktualnie wybraną do edycji macierz transformacji modyfikujemy za pomocą funkcji: ●

glLoadIdentity() –



glLoadMatrixf(float *v) –





Mnoży zawartość macierzy przez macierz odpowiadającą translacji o wektor [x; y; z]

glRotatef(float angle, float x, float y, float z) –

Mnoży zawartość macierzy przez macierz odpowiadającą rotacji o angle stopni wokół wektora [x; y; z]



Warto stosować z wersorami, np. [0; 1; 0]

glScalef(float xs, float ys, float zs) –

11.04.13

Mnoży zawartość macierzy przez macierz v

glTranslatef(float x, float y, float z) –



Zastępuje zawartość wartościami 16-elementowej tablicy

glMultMatrixf(float *v) –



Zastępuje zawartość macierzą jednostkową

Mnoży zawartość macierzy przez macierz odpowiadającą skalowaniu ze skalami [xs; ys; zs] Bartosz Bazyluk

14

Transformacje w OpenGL



Przykłady ●

Zakładamy, że hipotetyczna funkcja DrawBlackSquare() rysuje czarny kwadrat będący częścią płaszczyzny XY i rozciągający się w zakresie -1..1: +y 1 1

+x +z –





11.04.13

Na razie nie wnikamy, jak tego dokonuje

Scenę obserwujemy z punktu [0; 0; 5], patrząc w kierunku [0; 0; -1], wektor pionu [0; 1; 0] Projekcja perspektywiczna

Bartosz Bazyluk

15

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawBlackSquare();

11.04.13

Bartosz Bazyluk

16

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(2.0f, 0.0f, 0.0f); DrawBlackSquare();

11.04.13

Bartosz Bazyluk

17

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(2.0f, 0.0f, 0.0f); glTranslatef(0.0f, 1.0f, 0.0f); DrawBlackSquare();

11.04.13

Bartosz Bazyluk

18

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); DrawBlackSquare();

11.04.13

Bartosz Bazyluk

19

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(2.0f, 0.0f, 0.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); DrawBlackSquare();

11.04.13

Bartosz Bazyluk

20

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glTranslatef(2.0f, 0.0f, 0.0f); DrawBlackSquare();

11.04.13

Bartosz Bazyluk

21

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(45.0f, 0.0f, 1.0f, 0.0f); DrawBlackSquare();

11.04.13

Bartosz Bazyluk

22

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glScalef(1.0f, 2.0f, 1.0f); DrawBlackSquare();

11.04.13

Bartosz Bazyluk

23

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glScalef(1.0f, 2.0f, 1.0f); DrawBlackSquare(); DrawRedSquare(); ●

11.04.13

Stan macierzy pozostaje zmieniony!

Bartosz Bazyluk

24

Transformacje w OpenGL



Przykłady glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); glScalef(1.0f, 2.0f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare();

11.04.13

Bartosz Bazyluk

25

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M

stos

26

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M

stos

27

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M

stos

28

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M

stos

29

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M

M0 stos

30

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M

M0 stos

31

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M M1 M0 stos

32

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M M1 M0 stos

33

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M M1 M0 stos

34

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M M1

M0 stos

35

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M

M0 stos

36

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M M0

stos

37

Transformacje w OpenGL



Zapamiętywanie stanu macierzy na stosie ●





glPushMatrix() powoduje, że aktualny stan macierzy zostaje zapamiętany na stosie glPopMatrix() zdejmuje ze stosu ostatnio zapamiętany stan i przywraca go Możliwe jest wielokrotne zagnieżdżanie –

Podgląd rezultatu:

Przy czym należy pamiętać, że zawsze przywracamy ostatni stan

glMatrixMode(GL_MODELVIEW); glLoadIdentity(); DrawGreenSquare(); glTranslatef(2.0f, 0.0f, -1.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); glTranslatef(0.0f, 1.0f, 0.0f); glPushMatrix(); glScalef(1.5f, 1.5f, 1.0f); DrawBlackSquare(); glPopMatrix(); DrawRedSquare(); glPopMatrix(); DrawBlueSquare(); 11.04.13

Bartosz Bazyluk

aktualna macierz:

M

stos

38

Definicja geometrii w OpenGL



Najprostszą metodą definicji i renderowania geometrii jest tzw. immediate mode ●

Definicja własności wszystkich wierzchołków w każdej klatce



Podejście którego współcześnie się już nie stosuje –



Jest nieefektywne ●

W każdej klatce duża ilość danych przekazywana do karty graficznej



Współcześnie używa się buforów w pamięci karty graficznej

Jest najłatwiejsze w zrozumieniu

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

11.04.13

Bartosz Bazyluk

39

Definicja geometrii w OpenGL



Prymitywy oferowane przez OpenGL:

Źródło obrazu: http://www.opengl.org

11.04.13

Bartosz Bazyluk

40

Kolor w OpenGL



Częścią stanu OpenGL jest także kolor wierzchołków ●

Kolory określa się za pomocą komponentów RGB(A) –

Wartości są znormalizowane (0.0-1.0)



Czwarty kanał A może określać przezroczystość



Przykłady:

(1.0, 0.0, 0.0) (0.0, 1.0, 0.0) (0.0, 0.0, 1.0) (0.0, 0.0, 0.0) (1.0, 1.0, 1.0) (0.5, 0.5, 0.5) (1.0, 0.5, 0.5) (0.0, 0.6, 1.0) ●

Używa się do tego celu funkcji: glColor3f(float r, float g, float b) –

11.04.13

lub analogicznych (4f, 3fv, 4fv, ...) Bartosz Bazyluk

41

Kolor w OpenGL



Przykłady: glColor3f(1.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();

glBegin(GL_QUADS); glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glEnd(); 11.04.13

Bartosz Bazyluk

42

Kolor w OpenGL



Bardziej zaawansowane kolorowanie geometrii może wykorzystywać techniki takie, jak: ●

Oświetlenie (tzw. cieniowanie, ang. shading)



Teksturowanie (ang. texture mapping)

Źródła obrazów: http://pythonstuff.org http://marketplace.secondlife.com

11.04.13

Bartosz Bazyluk

43

Proste bryły w GLUT



Sześcian ●

glutSolidCube(size), glutWireCube(size) –



size – długość krawędzi

Aby uzyskać nieforemny prostopadłościan, należy poddać sześcian skalowaniu, np.: glutWireCube(1.0f);



11.04.13

glScalef(4.0f, 2.0f, 0.5f); glutWireCube(1.0f);

Należy pamiętać, że w ten sposób zmieniamy stan macierzy transformacji! Następne bryły też będą przeskalowane.

Bartosz Bazyluk

44

Proste bryły w GLUT



Kula ●

glutSolidSphere(size, slices, stacks), glutWireSphere(size, slices, stacks) –

size – długość promienia



slices, stacks – liczby podziałów

glutWireSphere(1.0f, 10, 10);

glutWireSphere(1.0f, 30, 10);

glutWireSphere(1.0f, 30, 30);

11.04.13

glutWireSphere(1.0f, 10, 30);

glutWireSphere(1.0f, 6, 6);

Bartosz Bazyluk

45

Proste bryły w GLUT



Stożek ●

glutSolidCone(base, height, slices, stacks), glutWireCone(base, height, slices, stacks) –

base – długość promienia podstawy



height - wysokość



slices, stacks – liczby podziałów, analogicznie do kuli

glutWireCone(1.0f, 2.0f, 16, 16);

11.04.13

Bartosz Bazyluk

46

Bartosz Bazyluk

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Grafika komputerowa i wizualizacja, Bioinformatyka S1, II Rok