Wykład 5 p. 1/? Oprogramowanie i wykorzystanie stacji roboczych Wykład 5 Dr inż. Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska
Wykład 5 p. 2/? Co to jest OpenGL? OpenGL (Open Graphics Library) jest niskopoziomowa biblioteka graficzna (API - programowy interfes sprzętu graficzengo) służac a do tworzenia grafiki 2D i 3D. Obsługiwana jest przez wszystkie liczace się systemy operacyjne oraz większość procesorów graficznych (kart graficznych). Pierwsza wersja biblioteki OpenGL powstała w 1992 roku na bazie języka Iris GL opracowanego przez firmę Silicon Graphics Inc. (SGI).
Wykład 5 p. 3/? OpenGL - Achitektura Aplikacja odwołuje się przez funkcje API OpenGL bezpośrednio do karty graficznej (z pominięciem systemu operacyjnego). Implementacja software owa - poszczególne funkcje moga być wykonywane przez CPU w przypadku, gdy procesor graficzny ich nie wspiera.
Wykład 5 p. 4/? OpenGL - zalety możliwość zastosowania w aplikacjach 2D i 3D, szybkość działania - wykorzystanie akceleracji sprzętowej, wysoka jakość wizualna utworzonych aplikacji, standard przemysłowy - OpenGL Architecture Review Board (ATI, NVIDIA, SGI, 3Dlabs, Apple, Intel, IBM, Sun), Khronos Group, wiarygodność i przenośność (OpenGL jest niezależna od systemu operacyjnego), ciagły rozwój - aktuala wersja jest 3.0, łatwość użycia, rozszerzalność (OpenGL extensions).
Wykład 5 p. 5/? OpenGL - Zastosowanie telewizja, kino, przemysł CAD/CAM/CAE, rozrywka (gry i programy multimedialne), medycyna pokazowa (trójwymiarowe modele), wirtualna rzeczywistość, urzadzenia mobilne (OpenGL ES),...
Wykład 5 p. 6/? OpenGL - Literatura www.opengl.org R. Wright, M. Sweet. OpenGL - księga eksperta, Wydawnictwo Helion, Warszawa 1999. A. Orłowski. OpenGL. Leksykon kieszonkowy, Wydawnictwo Helion, 2005. OpenGL Reference Manual - http://ask.ii.uib.no/ebt-bin/nphdweb/dynaweb/sgi_developer/opengl_rm OpenGL Programming Guide - http://ask.ii.uib.no/ebt-bin/nphdweb/dynaweb/sgi_developer/opengl_pg http://nehe.gamedev.net man pages.
Wykład 5 p. 7/? Przykładowe możliwości OpenGL (I) Rysowanie prymitywów - punkt, linia, trójkat, wielokat. Gouraud shading (cieniowanie Gouraud a) - cieniowanie na podstawie interpolacji kolorów ze wszystkich wierzchołków wielokata.
Wykład 5 p. 8/? Przykładowe możliwości OpenGL (II) Transformacje obiektów - możliwość obrotu, zmiany rozmiaru, przesunięcia obiektów. Texture mapping - Proces dodawania obrazu do prymitywnych elementów. Technika ta ma na celu podwyższenie realizmu obrazu.
Wykład 5 p. 9/? Przykładowe możliwości OpenGL (III) Z-buffering - Z-bufor jest struktura, w której przechowywane sa współrzędne z każdego piksela. pozwala na ułożenie obiektów w kolejności od najdalszych do tych najbliższych położeniu obserwatora. Double buffering (podwójne buforowanie) - używany do uzyskania płynnej animacji. Każda kolejna klatka animacji obiektu w ruchu konstruowana jest w ukrytym buforze i następnie wyświetlana. Pozwala to na wyświetlenie kompletnych już obrazów.
Wykład 5 p. 10/? Przykładowe możliwości OpenGL (IV) Alpha blending (efekt przeźroczystości pikseli) - Służy do uzyskania przeźroczystości. Można uzyskać obiekt od całkowicie przeźroczystego (poprzez różne jej stopnie) do całkowicie nieprzeźroczystego. Czcionki 2D i 3D
Wykład 5 p. 11/? Przykładowe możliwości OpenGL (V) Accumulation buffer Bufor, w którym wiele zrenderowanych ramek może zostać złożonych w celu otrzymania jednego połaczonego obrazu. Używany też do efektów takich jak motion blur (rozmycie) i anti-aliasing (uśrednianie kolorów krawędzi obiektu z tłem).
Wykład 5 p. 12/? Przykładowe możliwości OpenGL (VI) Anti-aliasing Metoda renderowania używana do wygładzania linii i krzywych. Technika polega na uśrednianiu koloru przylegajacego do linii. W efekcie uzyskuje się wrażenie miękkości (krawędzie nie sa postrzępione). Powierzchnie Beziera
OpenGL - warstwy API Wykład 5 p. 13/?
Struktura aplikacji Wykład 5 p. 14/?
Od modelu do widoku Wykład 5 p. 15/?
Prymitywy Wykład 5 p. 16/?
Transformacje obiektów Wykład 5 p. 17/?
Obcinanie Wykład 5 p. 18/?
Rzutowanie Wykład 5 p. 19/?
Rasteryzacja Wykład 5 p. 20/?
Wykład 5 p. 21/? Konwencje nazw funkcji Wszystkie funkcje OpenGL maja następujacy format: <Przedrostek biblioteki><rdzeń polecenia> <Opcjonalnie liczba argumentów><opcjonalnie typ argumentów>
Wykład 5 p. 22/? Konwencje nazw - typy w OpenGL Suffix Data Type Typical Corresponding C-Language Type OpenGL Type Definition b 8-bit integer signed char GLbyte s 16-bit integer short GLshort i 32-bit integer int or long GLint, GLsizei f 32-bit floating-point float GLfloat, GLclampf d 64-bit floating-point double GLdouble, GLclampd ub 8-bit unsigned integer unsigned char GLubyte, GLboolean us 16-bit unsigned integer unsigned short GLushort ui 32-bit unsigned integer unsigned int or unsigned long GLuint, GLenum, GLbitfield
Wykład 5 p. 23/? Konwencje nazw - przykłady Wszystkie poniższe wywołania funkcji określaja punkt o współrzędnych (1,3): glvertex2i(1, 3); glvertex2f(1.0, 3.0); GLfloat coords[] = {1.0, 3.0}; glvertex2fv(coords);
Wykład 5 p. 24/? Układ współrzędnych W OpenGL oś z jest zwrócona w kierunku obserwatora.
Wykład 5 p. 25/? OpenGL i Qt Biblioteka Qt może być wykorzystana do wyświetlania grafiki w OpenGL przy wykorzystaniu modułu QGL. Do wyświetlenia sceny w OpenGL w oknie Qt służy klasa QGLWidget. Tworzenie grafiki w takim oknie odbywa się poprzez wywołania funkcji z OpenGL, a nie wykorzystaniu klasy QPainter. Aby renderować scenę OpenGL należy utworzyć klasę dziedziczac a po klasie QGLWidget i zaimplementować metody: paintgl() resizegl() initializegl()
Wykład 5 p. 26/? Rzutowanie W OpenGL do określenia rzutu równoległego służy funkcja glortho. glortho(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
Wykład 5 p. 27/? Definiowanie widoku Do ustalenia obszaru okna (widok), przeznaczonego do wykorzystania przez OpenGL służy funkcja glviewport glviewport(glint x, GLint y, GLsizei width, GLsizei height);
Wykład 5 p. 28/? Kolory w OpenGL Kolory w OpenGL sa zadawane w trybie RGB lub RGBA (red, green, blue, alpha)
Wykład 5 p. 29/? Kolor tła Kolor tła może być ustawiony na dwa sposoby: poprzez funkcję z biblioteki OpenGL: void glclearcolor(glclampf red, GLclampf green, GLclampf blue, GLclampf alpha); lub przy wykorzystaniu metody qglcolor z klasy QGLWidget: void QGLWidget::qglColor (const QColor &c) const;
Wykład 5 p. 30/? paintgl - bufory W OpenGL w skład bufora ramki (pamięci obrazu) wchodza następujace bufory: bufor koloru (color buffer), bufor głębokości (depth buffer), bufor szblonowy (stencil buffer), bufor akumulacyjny (accumulation buffer). Przed przystapieniem do tworzenia sceny wykorzystywane bufory musza zostać wyczyszczone. Do tego celu służy funkcja glclear. Wyczyszczenie bufora kolorów (GL_COLOR_BUFFER_BIT): glclear(gl_color_buffer_bit);
Wykład 5 p. 31/? Macierze w OpenGL Biblioteka OpenGL do wykonywania operacji na punktach wykorzystuje macierze. Macierze przechowywane sa w stosach macierzy. Podstawowymi stosami macierzy w OpenGL sa: GL_MODELVIEW - stos macierzy widoku, GL_PROJECTION - stos macierzy rzutowania. Zmiana aktualnego stosu macierzy: glmatrixmode(glenum mode); Do zresetowania aktualnej macierzy służy funkcja: glloadidentity();
Wykład 5 p. 32/? Dodawanie obiektów do sceny Najpierw ustawia się jakiego typu prymitywy będa wykorzystywane do tworzenia bardziej złożonych obiektów, a następnie zadaje się ich poszczególne wierzchołki glbegin(gl_lines); glvertex3f(-1.0f, 0.0f, 0.0f); glvertex3f(1.0f, 0.0f, 0.0f); glvertex3f(-1.0f, 1.0f, 0.0f); glvertex3f(1.0f, 1.0f, 0.0f); glend() glbegin(gl_triangles); glcolor3f(1.0f, 0.0f, 0.0f); glvertex3f(-0.5f, 0.0f, 0.0f); glcolor3f(0.0f, 1.0f, 0.0f); glvertex3f(0.0f, 0.0f, 0.0f); glcolor3f(0.0f, 0.0f, 1.0f); glvertex3f(0.0f, 0.5f, 0.0f); glend()
Prymitywy Wykład 5 p. 33/?
Wykład 5 p. 34/? OpenGL i Qt - Przykład I #include <QGLWidget> class MyGLWidget : public QGLWidget { public: MyGLWidget(QWidget* parent = NULL); protected: void initializegl(); void paintgl(); void resizegl(int w, int h); };
Wykład 5 p. 35/? OpenGL i Qt - Przykład II void MyGLWidget::initializeGL() { qglclearcolor(qt::black); } void MyGLWidget::resizeGL(int w, int h) { glviewport(0, 0, w, h); glmatrixmode(gl_projection); glloadidentity(); glortho(-3.0f, 3.0f, -3.0f, 3.0f, 1.0, -1.0); glmatrixmode(gl_modelview); }
Wykład 5 p. 36/? OpenGL i Qt - Przykład III void MyGLWidget::paintGL() { glclear(gl_color_buffer_bit); glloadidentity(); } glbegin(gl_lines); glvertex3f(-2.0, -2.0, 0.0); glvertex3f(2.0, 2.0, 0.0); glend();
Wykład 5 p. 37/? OpenGL i Qt - Przykład IV int main(int argc, char **argv) { QApplication a(argc, argv); if (!QGLFormat::hasOpenGL()) { qwarning("this system has no OpenGL support. Exiting."); return -1; } } MyGLWidget widget; widget.resize(150, 150); widget.show(); return a.exec();
Wykład 5 p. 38/? Ustawienie koloru obiektów Do ustawiania aktualnego koloru służy funkcja glcolor* 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); Do rysowania elementu wykorzystywany jest aktualnie ustawiony kolor: ustaw_kolor(red); rysuj_obiekt(a); rysuj_obiekt(b); ustaw_kolor(green); ustaw_kolor(blue); rysuj_obiekt(c);
Wykład 5 p. 39/? Kolory wielokatów Wypełnianie wielokata jednolitym kolorem, zgodnym z kolorem aktualnym w momencie podawania ostatniego wierzchołka: glshademodel(gl_flat); Płynne przejście pomiędzy kolorami wierzchołków poprzez interpolację kolorów pośrednich: glshademodel(gl_smooth);