Stručný přehled OpenGL Jiří Danihelka
Co je OpenGL? Open Graphics Library Knihovna pro počítačovou grafiku Zhruba 120 funkcí Představuje standard grafického rozhraní pro přístup k akcelerovaným grafickým kartám
Vlastnosti OpenGL Využívá jazyk C, ale dá se používat i v jiných jazycích ( Fortran,Pascal,Java ) Velká snaha o platformovou nezávislost Hardwarově nepodporované operace jsou softwarově simulovány
Platformová nezávislost OpenGL OpenGL používá vlastní primitivní datové typy GLbyte, GLint, GLdouble
Platformová nezávislost OpenGL OpenGL neobsahuje žádné příkazy pro práci s okny Je třeba využít jiné knihovny pro otevření okna pro kreslení Vhodné knihovny: SDL, GLUT, GLX, WGL
Co OpenGL není Komplexní knihovna pro počítačové hry Knihovna pro ovládání periférií Zvuková knihovna Knihovna pro komunikaci po síťi Knihovna pro načítání formátů souborů Je potřeba použít jiné knihovny SDL, GLUT, GLX, WGL, DirectX…
Ukázka programu v OpenGL void draw(void) { glClear(GL_COLORBUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); glFlush(); }
Výsledek
Ukázka programu v OpenGL void draw(void) { glClear(GL_COLORBUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 0.0f); glEnd(); glFlush(); }
Zápis volání funkcí v OpenGL např.: glVertex3fv(v[0]); názvy všech funkcí začínají gl... dále následuje jméno funkce (Vertex) 3 – značí počet parametrů f – značí typ parametrů (GLfloat) v – značí předání parametrů ukazatelem
Zápis funkcí v OpenGL Většinu funkcí OpenGL lze volat s různým počtem a druhem parametrů např.: glVertex3fv glVertex3f glVertex4d glVertex2i
Zápis funkcí v OpenGL Význam jednotlivých písmen b – GLbyte (8 bitů) ub – GLubyte (8 bitů) s – GLshort (16 bitů) us – GLushort (16 bitů) i – GLint (32 bitů) ui – GLuint (32 bitů) f – GLfloat (32 bitů) d – GLdouble (64 bitů)
Základní příkazy OpenGL 98% veškerého kreslení je prováděno pomocí následujících tří funkcí: glBegin(základní_tvar); glVertex...(souřadnice); glVertex...(souřadnice);... glVertex...(souřadnice); glEnd();
Základní tvary OpenGL GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_POLYGON GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_QUADS GL_QUAD_STRIP
Základní tvary OpenGL GL_POINTS GL_LINES
Základní tvary OpenGL GL_LINE_STRIP GL_LINELOOP
Základní tvary OpenGL GL_TRIANGLES GL_TRIANGLE_STRIP
Základní tvary OpenGL GL_TRIANGLE_FAN GL_QUADS
Základní tvary OpenGL GL_TRIANGLE_FAN GL_QUAD_STRIP
Barvy v OpenGL Barvu lze nastavit pomocí funkce glColor{3,4}{b,i,f,d}{v}(parametry); Barvu lze měnit kdykoliv a výsledek se projeví na všech dalších vrcholech až do příští změny barvy
Barevný trojúhelník void draw(void) { glClear(GL_COLORBUFFER_BIT); glColor3f(0, 1.0f, 0); glBegin(GL_TRIANGLES); glVertex3f(...); glVertex3f(...); glVertex3f(...); glEnd(); glFlush(); }
Vícebarevný trojúhelník void draw(void) { glClear(GL_COLORBUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1.0f, 0, 0); glVertex3f(...); glColor3f(0, 1.0f, 0); glVertex3f(...); glColor3f(0, 0, 1.0f); glVertex3f(...); glEnd(); glFlush(); }
Stavy OpenGL Některé příkazy mění globálně způsob vykreslování (=stav) glColor...(...); glClearColor(...); Používání stavů má výhody i nevýhody
Animace – první pokus void draw(int faze) { glClear(GL_COLORBUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(0.0f+faze, 10.0f, 0.0f); glVertex3f(-10.0f+faze, -10.0f, 0.0f); glVertex3f(10.0f+faze, -10.0f, 0.0f); glEnd(); glFlush(); }
Double buffer Máme dvě místa na kreslení (buffery), jedno na monitoru, druhé v paměti Kreslíme nejprve do paměti Až bude kresba dokončená buffery prohodíme a obrázek se objeví na monitoru bez nepříjemného blikání
Double buffer - poznámka Operace s double bufferem nejsou součástí příkazů OpenGL, ale jsou obsažené v jiných knihovnách Například: glutSwapBuffers(); Pro některá zobrazovací zařízení může být bufferů i více než 2 (brýle virtuální reality)
3D grafika
Co je potřeba nastavit v 3D polohu kamery čočku kamery polohu zobrazovaných objektů
Nastavení polohy kamery void glTranslate{f,d}(x, y, z);
Nastavení polohy kamery void glRotate{f,d}(uhel,x, y, z);
Nastavení polohy kamery void glScale{f,d}(x, y, z);
Poloha kamery - poznámky Na výslednou polohu kamery má zásadní vliv pořadí transformačních operací Kameru je potřeba nastavit ještě před kreslením Polohu kamery je možné měnit i během vykreslování. Neměňte polohu mezi glBegin a glEnd
Funkce gluLookAt 3 trojice čísel poloha kamery poloha objektu vektor nahoru
Ortogonální projekce Pomocí funkce glOrtho(...);
Nastavení čočky kamery Pomocí funkce glFrustum(...);
Nastavení čočky kamery
Využití změn kamery
Animace – druhý pokus void draw(int faze) { glTranslate(-faze,0,0); glClear(GL_COLORBUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(0.0f, 10.0f, 0.0f); glVertex3f(-10.0f, -10.0f, 0.0f); glVertex3f(10.0f, -10.0f, 0.0f); glEnd(); glFlush(); }
Pořadí vykreslování
Z-Buffer Paměť do které se ukládá vzdálenost nakresleného pixelu od pozorovatele Je obvykle hardwarově akcelerována glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Z-Buffer demonstrace
Textury
Zvolení textury glTexImage2D(...); Parametry: výška, šířka, barevná hloubka, ukazatel na pole bytů
Nastavení souřadnic textury void draw(void) { glClear(GL_COLORBUFFER_BIT); glBegin(GL_QUADS); glTexCoord2f(1.0f, 0); glVertex3f(...); glTexCoord2f(1.0f, 1.0f); glVertex3f(...); glTexCoord2f(0, 1.0f); glVertex3f(...); glTexCoord2f(0.0f, 0.0f); glVertex3f(...); glEnd(); glFlush(); }
Výsledek použití textury
Druhy světelných zdrojů všesměrový zdroj reflektor rovnoběžné paprsky všudypřítomné světlo
Příkazy pro práci se světlem glLight...v(index, vlastnosti, intenzita); Vytvoří nový světelný zdroj glNormal3f(x,y,z); Nastaví normálový vektor ve vrcholu Píše se většinou před každý glVertex
Výpočet pseudonormálů
Stínovací metody
Display Lists id = glGenLists(1); glNewList(id, GL_COMPILE;.... glEndList(id);
Použité zdroje nehe.opengl.cz jiné internetové stránky
Konec Dotazy?