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