Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Wprowadzenie do grafiki komputerowej Podstawy OpenGL Wersja 2.1, a właściwie 1.x Krótka informacja o JOGL.

Podobne prezentacje


Prezentacja na temat: "Wprowadzenie do grafiki komputerowej Podstawy OpenGL Wersja 2.1, a właściwie 1.x Krótka informacja o JOGL."— Zapis prezentacji:

1 Wprowadzenie do grafiki komputerowej Podstawy OpenGL Wersja 2.1, a właściwie 1.x Krótka informacja o JOGL

2 Co to jest OpenGL? Jest to przenośna, wieloplatformowa biblioteka graficzna. Działa w środowisku MS Windows, Linux, IOS, Android… Oryginalnie przewidziana do współpracy z językiem C Dzięki licznym wrapperom może być użyta z wieloma językami. Można zajrzeć na stronę Między innymi: C++ Java Python Ruby … (w sumie 16 języków lub coś koło tego)

3 Co to jest OpenGL, c.d. najkrótszej charakterystyki Open GL jest określany jako API (Application Programming Interface, Interfejs programowania aplikacji). OpenGL jest niezależny od sprzętu Obecnie to nie sprzęt dyktuje warunki. Jednak dawniej było inaczej – przykład Silicon Graphics. Jest uważany za bibliotkę niskopoziomową grafiki 3D. Stanowi podstawę dla bibliotek i pakietów narzędziowych wysokiego poziomu (np. Open Inventor, Open Scene Graph i innych) oraz licznych aplikacji. Głównym konkurentem OpenGL jest wprowadzona w roku 1995 przez Microsoft biblioteka Direct3D/DirectX

4 OpenGL jako narzędzie do renderowania Tworzy elementarne obiekty geometryczne (primitives) Wykorzystuje do tego: punkty, linie, wielokąty Wykonuje operacje na obrazach rastrowych Renderuje sceny zależnie od stanu Uwzlędnia: kolory, materiały, źródła światła, etc.

5 Najkrótsza historia OpenGL Utworzona z biblioteki IRIS GL (Graphics Library) – SGI, z Od 1992 rozwijana przez Architecture Review Board (ARB) już jako OpenGL (wersja 1.0 została ogłoszona w czerwcu 1992). Kluczowi uczestnicy ARB: SGI, DEC, IBM, Intel, Microsoft. W kolejnych latach ogłaszane są oficjalne wersje: 1.1, 1.2, 1.2.1, 1.3, 1.4, 1.5. Wersja 2.0 ogłoszona w 2004 włączyła oficjalnie język shaderów (OpenGL Shading Language, GLSL). Wersja 2.1 kończy serię bibliotek kompatybilnych wstecz. W dalszym ciągu może być i jest używana.

6 Najkrótsza historia OpenGL, c.d. Od września 2006 nadzór na rozwojem OpenGL sprawuje Khronos Group. W sierpniu 2008 ogłoszono OpenGL 3.0, kompatybilny z wcześniejszymi wersjami, ale zapowiadający usuwanie starszych rozwiązań w kolejnych wersjach. Realizuje wersję 1.30 GLSL. W marcu 2009 – OpenGL GLSL W sierpniu 2009 – OpenGL GLSL W marcu 2010 – OpenGL 3.3 i 4.0 W lipcu 2010 – OpenGL 4.1 W tej chwili bieżącymi wersjami są OpenGL 3.3 i 4.4

7 Na czym polega przełom pomiędzy wersją 2.1, a późniejszymi? Wersje =< 2.1 pozwalały na ukrycie karty graficznej przed użytkownikiem W wersji 2.1 można jawnie programować kartę graficzną za pomocą GLSL (jawnie korzystać z shaderów), można jednak korzystać jedynie z mechanizmów OpenGL. W wersji 3.3 istnieje tryb tradycyjny (Compatibility Mode) i tryb nowy (Core Mode) pozwalający na efektywne wykorzystanie procesorów graficznych. W wersji 3.3 (Core Mode) jawne korzystanie z shaderów jest konieczne.

8 Podsumowanie Przygotowując program w OpenGL w wersji > 3.0, w rzeczywistości przygotowujemy DWA programy: pierwszy, opisany przy pomocy funkcji OpenGL realizowany na CPU (przygotowuje scenę, buduje obiekty) drugi opisany przez język shaderów GLSL, realizowany na GPU (dokonuje przekształceń obiektów i renderowania) W wersji 2.1 mamy możliwość wyboru: piszemy albo z shaderami, albo bez – przełączenie nie jest zbyt zgrabne. W wersjach wcześniejszych nie korzystamy z shaderów. Prościej, ale: Mniejsze możliwości renderowania, niższa efektywność kodu, nie zawsze jasne działanie funkcji OpenGL.

9 Potok renderowania; model klient-serwer klient – kod pracujący na CPU serwer – kod pracujący na GPU

10 Różne linki do tutoriali starego OpenGL W tej chwili podstawowym linkiem jest: W nim można znaleźć dużo przykładów i tutoriali.

11 Z czego składa się OpenGL? Z biblioteki właściwej GL; Nazwy funkcji zaczynają się od gl (np. glClearColor ). W wersji 2.1 mamy 249 funkcji. W wersji funkcji. Z pomocniczej biblioteki narzędziowej W wersji 2.1 – Biblioteka GLU (OpenGL Utilities) W wersji 3.3 …no właśnie … wszystko jest w trakcie tworzenia … Można np. korzystać z biblioteki GLTools związanej z podręcznikiem OpenGL SuperBible. Przykłady, m.in.

12 Z czego składa się OpenGL? Podstawy OpenGL GL - biblioteka podstawowa, >180 funkcji, nazwy funkcji zaczynają się od gl (np. glClearColor() ) GLU - biblioteka funkcji pomocniczych (OpenGL Utilities). Funkcje GLU obsługują orientację w przestrzeni (np. gluLookAt() ), rzutowanie (np. gluPerspective() ), renderowanie krzywych i powierzchni. GLUT - biblioteka narzędziowa (OpenGL Utility Toolkit), GUI obsługuje okna, zdarzenia, prosty interfejs użytkownika. Jej główną zaletą jest prostota. Dostępne są liczne inne GUI.

13 Pożyteczne książki Podstawy OpenGL R.S.Wright, et al.. OpenGL-Superbible, 5th edition, Addison-Wesley, 2010 Randi J. Rost, OpenGL Shading Language, 3rd edition, 2009 T. Akenine-Moller, Real-time rendering, 3rd edition, 2009 M. Bailey i S. Cunnigham, Graphics shaders, A.K. Peters, 2009 M.Woo, J.Neider, T.Davies, OpenGL – Programming Guide, Addison- Wesley, 7th edition, 2010 (wersja elektroniczna, np. fly.srk.fer.hr/~unreal/theredbook/ )

14 Dostępne książki (po polsku + RedBook) Podstawy OpenGL R.S.Wright, M.Sweet, OpenGL-Księga eksperta, Helion 1999 R.S.Wright, B.Lipchak, OpenGL-Księga eksperta, Helion 2005 (wyd 3.) K.Hawkins, D.Astle, OpenGL – Programowanie Gier, Helion 2003 P. Andrzejewski, J.Krzak, Wprowadzenie do OpenGL, Kwantum 2000 M.Woo, J.Neider, T.Davies, OpenGL – Programming Guide, Addison- Wesley (wersja elektroniczna, np. fly.srk.fer.hr/~unreal/theredbook/ )

15 Pożyteczne linki strona Janusza Ganczarskiego januszg.hg.pl znany tutorial nehe.gamedev.net strona podstawowa OpenGL,

16 Instalacja JOGL w Eclipse Skorzystałem z tutoriala: Autor (http://schabby.de/) prowadzi też stronę-blog m.in. na temat JOGLhttp://schabby.de/ Inny wideo tutorial:

17 Pożyteczne linki dla JOGL podstawowa strona biblioteki, taki odpowiednik opengl.org sympatyczna strona z podręcznikiem i licznymi przykładami kurs wideo (również na youtube) + przykłady oparte na NeHe

18 Na początek – GLUT (a właściwie FreeGLUT) Podstawy OpenGL Na następnych slajdach przedstawione są krótko wybrane funkcje GLUT (daleko nie wszystkie). Pełny opis w dokumentacji Marka Kilgarda (autora biblioteki). Również jest dostępna na gd.tuwien.ac.at/graphics/GLUT/glut3.html freeGLUT - bieżąca wersja: z kwietnia 2013 (z wxDev C++ działa chyba wersja 2.6.0)

19

20 Zasadnicze funkcje biblioteki GLUT/freeglut Obsługa okien (otwarcie okna, ustalenie poczatkowego położenia i rozmiarów, etc.) Obsługa zdarzeń (klawiatury, myszki, zmiany rozmiarów i proporcji okna) Przygotowanie prostego menu Budowanie prostych obiektów geometrycznych (sfera, sześcian i inne wielościany, walec, …)

21 Przykład z czerwonej książki Podstawy OpenGL #include void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); // czarne tło glMatrixMode(GL_PROJECTION); // tryb rzutowania glLoadIdentity(); // macierz jednostkowa glOrtho(0.0, 10.0, 0.0, 10.0, -1.0, 1.0); // obszar rzutowania } void display(void) { glClear( GL_COLOR_BUFFER_BIT); glColor3f(0.0, 1.0, 0.0); glBegin(GL_POLYGON); glVertex3f(2.0, 4.0, 0.0); glVertex3f(8.0, 4.0, 0.0); glVertex3f(8.0, 6.0, 0.0); glVertex3f(2.0, 6.0, 0.0); glEnd(); glFlush(); }

22 Przykład z czerwonej książki, c.d. Podstawy OpenGL int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode ( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowPosition(100,100); glutInitWindowSize(300,300); glutCreateWindow ("square"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }

23 Omówienie niektórych funkcji GLUT

24

25 Inicjalizacja i obsługa okien Mamy dostępne następujące funkcje: glutInit(); glutInitWindowPosition(); glutInitWindowSize(); glutInitDisplayMode(); glutCreateWindow();

26 GLUT, freeglut – inicjowanie biblioteki Podstawy OpenGL void glutInit(int *argcp, char **argv) Zainicjowanie biblioteki GLUT. Ta funkcja zawsze jest wywoływana na początku. Może zakończyć się błędem, gdy np. system nie obsługuje OpenGL. W ogólności przekazuje parametry umieszczone w linii wywołania programu, ale tylko w X Windows została zaimplementowana interpretacja kilku parametrów.

27 GLUT – inicjowanie okna Podstawy OpenGL void glutInitWindowPosition(int x, int y); void glutInitWindowSize(int x, int y); Zgodnie z nazwą, funkcje określają: początkowe położenie okna – x, y są współrzędnymi lewego górnego rogu; początkowy rozmiar okna, domyślnie 300x300 pikseli x, y są współrzędnymi ekranowymi wyrażonymi w pikselach od lewego górnego rogu ekranu.

28 GLUT - inicjowanie trybu wyświetlania w oknie Podstawy OpenGL void glutInitDisplayMode(GLbitfield mode); void glutInitDisplayMode(unsigned long int mode); mode jest bitową sumą poszczególnych masek bitowych (zapisanych symbolicznie): GLUT_RGBA, GLUT_INDEX GLUT_SINGLE, GLUT_DOUBLE pojedynczy lub podwójny bufor ekranu GLUT_DEPTH aktywny bufor głębokości GLUT_ACCUM aktywny bufor akumulacji GLUT_ALPHA GLUT_STENCIL GLUT_STEREO

29 GLUT – obsługa okien Otwarcie okna graficznego Podstawy OpenGL void glutCreateWindow(char *name) Otwarcie okna na ekranie; name jest łańcuchem znaków wpisanym w górnej belce okna.

30 Wybrane funkcje obsługi zdarzeń Podstawy OpenGL void glutDisplayFunc(void(*func)(void)) void glutReshapeFunc(void(*func)(int w, int h)) void glutKeyboardFunc(void(*func) (unsigned char key, int x, int y))

31 Wybrane funkcje obsługi zdarzeń Podstawy OpenGL void glutSpecialFunc(void(*func) (unsigned char key, int x, int y)) Oznaczenia kluczy: GLUT_KEY_* GLUT_KEY_F1,...,GLUT_KEY_F12 GLUT_KEY_LEFT, GLUT_KEY_UP, GLUT_KEY_RIGHT, GLUT_KEY_DOWN GLUT_KEY_PAGE_UP, GLUT_KEY_PAGE_DOWN GLUT_KEY_HOME, GLUT_KEY_END, GLUT_KEY_INSERT

32 Wybrane funkcje obsługi zdarzeń Podstawy OpenGL void glutMouseFunc(void(*func) (int button, int state, int x, int y)) button: GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON state: GLUT_DOWN, GLUT_UP void glutMotionFunc(void(*func)(int x, int y)) void glutMainLoop(void);

33 Wybrane funkcje obsługi zdarzeń Podstawy OpenGL void glutIdleFunc(void (*func)(void)) glutIdleFunc wprowadza nieprzerywalną pętlę. Ew. przerwanie: glutIdleFunc(NULL) void glutPostRedisplay(void)

34 Obiekty z oryginalnej biblioteki GLUT (tylko do wersji 2.1 włącznie) void glutWireSphere(GLdouble r, GLint slices, GLint stacks); void glutSolidSphere(GLdouble r, GLint slices, GLint stacks); void glutWireCube(GLdouble size); void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); void glutWireIcosahedron(void); void glutWireOctahedron(void); void glutWireTetrahedron(void); void glutWireDodecahedron(GLdouble radius); void glutWireTeapot(GLdouble size);

35 W bibliotece freeglut dochodzi jeszcze parę obiektów. glutWireCone, glutSolidCone glutWireRhombicDodecahedron, glutSolidRhombicDodecahedron glutWireTeacup, glutSolidTeacup, glutWireTeaspoon, glutSolidTeaspoon Można je znaleźć w dokumentacji freeglut

36 Typy danych w OpenGL Podstawy OpenGL SuffixData typeC typeOpenGL type b8-bit integersigned char GLbyte s16-bit integershort GLshort i32-bit integerint/long GLint, GLsizei f32-bit floating pointfloat GLfloat, GLclampf d64-bit floating pointdouble GLdouble, GLclampd ub8-bit unsigned integerunsigned char GLubyte, GLboolean us16-bit unsigned integerunsigned short GLushort ui32-bit unsigned integerunsigned int/long GLuint, GLenum, GLbitfield OpenGL wprowadził własne typy danych w celu zapewnienia przenośności programów. Używanie standardowych oczywiście też jest dopuszczalne

37 Typy danych w OpenGL, cd Podstawy OpenGL Gdy spojrzymy na typy danych OpenGL, odnajdujemy odpowiedniki z C/C++. Z małymi wyjątkami. GLclampf, GLclampd – to float i double obcięty do [0,1]

38 Konwencje nazw funkcji OpenGL w zasadzie nie dopuszcza przeładowania funkcji. W zamian za to wprowadzony jest system jedno- lub dwuznakowych sufiksów; Maksymalnie można użyć trzech: pierwszy określa liczbę argumentów, drugi (jeden lub dwa znaki) określa typ parametru trzeci – jeśli występuje, pokazuje że podany jest adres do argumentów Od OpenGL 1.5 możliwe jest przeładowywanie funkcji odwołujących się do buforów jako obiektów (wspomnimy o tym później)

39 Konwencje nazw funkcji Podstawy OpenGL Wszystkie funkcje poprzedzone są przedrostkiem gl, glu, glut po którym następuje określenie funkcji pisane dużą literą. Nazwy funkcji wskazują na liczbę i typ argumentów. Funkcje zakończone na f wymagają float, i wymagają int, b wymagają byte, ub wymagają unsigned byte, itd. Funkcje zakończone na v wymagają tablicy. Na przykład glColor3f() 3 floaty glColor4fv() tablica 4 floatów

40 Konwencje nazw funkcji – jeszcze raz Podstawy OpenGL glVertex3fv( v ) Number of components 2 - (x,y) 3 - (x,y,z) 4 - (x,y,z,w) Data Type b - byte ub - unsigned byte s - short us - unsigned short i - int ui - unsigned int f - float d - double Vector omit v for scalar form glVertex2f( x, y )

41 Konwencje nazw zmiennych stanu biblioteki Podstawy OpenGL OpenGL zawiera ponad 250 parametrów (zmiennych stanu) określających stan maszyny OpenGL – środowisko tworzenia grafiki. Parametry zapisywane symbolicznie dużymi literami są poprzedzone przedrostkiem GL_, np. GL_SMOOTH, GL_FLAT. Analogiczne parametry (choć w mniejszej ilości) dostarczone są do bibliotek GLU, GLUT. Ich postać jest analogiczna, np. GLU_POINT GLUT_RGBA GLUT_SINGLE

42 Jeszcze o zmiennych stanu Podstawy OpenGL Zmienne stanu mogą być skalarami lub tablicami zawierającymi maski bitowe lub wielkości typu int, float, double. Do ich ustawienia stosujemy raczej funkcje OpenGL, niż bezpośrednie podstawienie wartości – o tym będzie mowa później. Możemy też pytać o bieżące ustawienia zmiennych stanu. Zmienne stanu mają na początku pewne sensowne wartości domyślne, więc na ogół coś się na ekranie narysuje (choć nie zawsze tak, jak tego chcielibyśmy).

43 Pytanie o binarne zmienne stanu Podstawy OpenGL O zmienne stanu, które są wartościami logicznymi możemy zapytać funkcją: GLboolean glIsEnabled(GLenum opis); np. glIsEnabled(GL_DEPTH_TEST); W odpowiedzi otrzymujemy GL_TRUE lub GL_FALSE O inne zmienne pytamy przez glGet…()

44 Ogólne pytanie o zmienne stanu OpenGL umożliwia również ogólne zapytanie o zmienne stanu różnych typów: void glGetBooleanv(GLenum pname, GLboolean* param); void glGetDoublev(GLenum pname, GLdouble* param); void glGetFloatv(GLenum pname, GLfloat* param); void glGetIntegerv(GLenum pname, GLint* param); pname jest nazwą zmiennej stanu; niestety trzeba znać te nazwy. Można je znaleźć między innymi na stronie param zwraca wskaźnik do zmiennej zawierającej wartość wybranej zmiennej stanu

45 Układ współrzędnych Podstawy OpenGL y x z W OpenGL przyjęto układ prawoskrętny. (Przeciwstawiając się wcześniejszej tradycji, zgodnie z którą w grafice komputerowej stosowano raczej układ lewoskrętny)

46 Niektóre operacje wstępne Podstawy OpenGL Na następnym slajdzie...

47 Czyszczenie ekranu (lub ogólniej buforów) Podstawy OpenGL void glClear(GLbitfield mask) void glClear(unsigned long int mask) Argument mask wskazuje, które bufory powinny zostać wyczyszczone. GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT GL_STENCIL_BUFFER_BIT GL_ACCUM_BUFFER_BIT Obecnie interesuje nas przede wszystkim postać void glClear(GL_COLOR_BUFFER_BIT)

48 Czyszczenie ekranu różnymi kolorami Podstawy OpenGL void glClear(GL_COLOR_BUFFER_BIT); domyślnie czyści ekran kolorem czarnym (zeruje bufor) Możemy określić dowolny kolor funkcją: void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); Np. void glClearColor(1.0f,1.0f,1.0f,1.0f);

49 Ustawienie bieżącego koloru do rysowania Podstawy OpenGL Zajmujemy się wyłącznie trybem RGB/RGBA Tryb pracy zazwyczaj jest taki: ustaw_bieżący_kolor(red); rysuj_obiekt(A); rysuj_obiekt(B); ustaw_bieżący_kolor(blue); ustaw_bieżący_kolor(green); rysuj_obiekt(C); Samo rysowanie jest oderwane od koloru. Bieżący kolor jest kontekstem ustawionym przez zmienne stanu.

50 Ustawienie bieżącego koloru do rysowania, c.d. Podstawy OpenGL Ustawienie bieżącego koloru. Ogólna postać. Przesadnie ogólna, ale tym razem niech będzie void glColor3{b|s|i|f|d|ub|us|ui} (TYPE r, TYPE g, TYPE b); void glColor4{b|s|i|f|d|ub|us|ui} (TYPE r, TYPE g, TYPE b, TYPE a); void glColor3{b|s|i|f|d|ub|us|ui}v (const TYPE *v); void glColor4{b|s|i|f|d|ub|us|ui}v (const TYPE *v);

51 Ustawienie bieżącego koloru do rysowania, c.d. Podstawy OpenGL Typowe wywołania np: glColor3f(1.0f, 0.5f, 0.3f); glColor4f(1.0f, 1.0f, 0.0f, 1.0f); Jeśli pominiemy wywołanie glColor, to zostanie przyjęta wartość domyślna: glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

52 Rysowanie punktów, linii, wielokątów Podstawy OpenGL void glBegin(GLenum mode) void glEnd(void) GLfloat pt[2] = {3.0, 4.0}; glBegin(GL_POINTS); glVertex2f(1.0, 2.0); // x=1, y=2 glVertex2f(2.0, 3.0); // x=2, y=3 glVertex2fv(pt); // x=3, y=4 glVertex2i(4,5); // x=4, y=5 glEnd(); glBegin (GL_LINE_LOOP); for (j=0; j<10; j++) { angle = 2*M_PI*j/10; glVertex2f (cos(angle), sin(angle); } glEnd();

53 Triangle strip Podstawy OpenGL glBegin(GL_TRIANGLE_STRIP); glVertex3fv(v0); glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); glVertex3fv(v4); glVertex3fv(v5); glEnd(); Kolejność przeglądania węzłów: – trójkąt 0 -> v0, v1, v2 – trójkąt 1 -> v2, v1, v3 (czemu nie v1, v2, v3?) – trójkąt 2 -> v2, v3, v4 – trójkąt 3 -> v4, v3, v5 (nie v3, v4, v5) v0v0 v1v1 v5v5 v0v0 v1v1 v5v5 v0v0 v1v1 v5v5 v5v5 v5v5 v0 v1 v2 v3 v4

54 Przykład: rysowanie siatki Podstawy OpenGL GLint size = 20; GLfloat x, z, punkt1[3], punkt2[3]; GLfloat x0 = -10, z0 = -10, krok = 1.0, value = 0.5; glClear(GL_COLOR_BUFFER_BIT); punkt1[1] = punkt2[1] = value; for(x = x0; x < x0 + size; x += krok){ punkt1[0] = x; punkt2[0] = x + krok; glBegin(GL_TRIANGLE_STRIP); for(z = z0; z < z0 + size; z += krok) { punkt1[2] = punkt2[2] = z; glVertex3fv(punkt1); glVertex3fv(punkt2); } glEnd(); }

55 Koniec wstępu Podstawy OpenGL


Pobierz ppt "Wprowadzenie do grafiki komputerowej Podstawy OpenGL Wersja 2.1, a właściwie 1.x Krótka informacja o JOGL."

Podobne prezentacje


Reklamy Google