Stručný přehled OpenGL
-
Upload
jiri-danihelka -
Category
Software
-
view
554 -
download
0
Transcript of Stručný přehled OpenGL
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, GLW
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é knihovnySDL, GLUT, GLX, WGL
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(); }
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(); }
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
glVertex3fglVertex4dglVertex2i
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_STRI
P 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íkvoid draw(void){ glClear(GL_COLORBUFFER_BIT); glColor3f(0, 1.0f, 0); glBegin(GL_TRIANGLES); glVertex3f(...); glVertex3f(...); glVertex3f(...); glEnd(); }
Vícebarevný trojúhelníkvoid 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(); }
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(); }
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(); }
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(); }
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 vrcholuPíše se většinou před každý glVertex
Výpočet pseudonormálů
Stínovací metody
Konec
Dotazy?