´ r´ı 2013, Brno 24. zaˇ ´ Pˇripravil: David Prochazka
´ Zaklady OpenGL ˇ ıtacov ˇ a´ grafika 2 Poc´
Graficke´ knihovny
ˇ Obsah pˇredna´ sky 1
Graficke´ knihovny
2
´ ı rastroveho ´ Vykreslovan´ obrazu
3
OpenGL aplikace
4
Shrnut´ı
Strana 2 / 25
Graficke´ knihovny
Strana 3 / 25
Graficke´ knihovny a jejich vyznam ´ Kaˇzd´y si muˇ ˚ ze napsat svou grafickou knihovnu. ´ Ma´ vˇsak v´yznam pouze tehdy pokud je podporovana v´yrobci grafick´ych karet. ˇ zneˇ HW podporovany ´ pouze Microsoft Dnes jsou beˇ DirectX a OpenGL. Existuj´ı dalˇs´ı knihovny/enginy, ktere´ jsou postaveny na OpenGL/DirectX (XNA, Open Inventor). Jejich uˇ ´ celem je usnadnit v´yvoj grafick´ych aplikac´ı. Tyto knihovny generuj´ı obvykle optimalizovan´y OpenGL ´ resp. DirectX kod. Jejich pouˇzit´ı muˇ ˚ ze zv´ysˇ it (ale nemus´ı!) v´ykon aplikace.
Graficke´ knihovny
Vyznam ´ hardwarove´ akcelerace
Strana 4 / 25
Graficke´ knihovny
Strana 5 / 25
OpenGL API pro tvorbu 2D a 3D graf. aplikac´ı (podobne´ Direct3D, ˇ s´ı), DirectX je komplexnejˇ ´ nezavisl a´ na platformeˇ nebo jazyku (DirectX je pouze pro Windows), ´ ı, lze vˇsak vytvaˇ ´ ret objektove´ OpenGL je proceduraln´ aplikace (DirectX je plneˇ objektov´y), ´ vˇse je vykreslovano z graf primitiv (bod, linie, polygon, pixmapa, bitmapa), OpenGL je stavov´y stroj (pokud nastav´ıte, zˇ e plochy maj´ı ´ ı), m´ıt urˇcitou barvu, bude to platit do odvolan´ OpenGL pouˇz´ıva´ knihovnu GLUT (OpenGL Utility Toolkit) ˇ pro tvobu GUI a zjednoduˇsen´ı nekter´ ych operac´ı, ´ souˇcast´ı OpenGL je GL Shanding Language (GLSL), kter´y ˇ ´ et ˇ ˇradu operac´ı na graficke´ karte. ˇ umoˇznuje provad
Graficke´ knihovny
Strana 6 / 25
ˇ a´ historie OpenGL Velmi strucn 1980: Iris GL – Silicon Graphics, SGI stanice, 1992: OpenGL 1.0 – Mark Segal and Kurt Akeley, ´ s texturami, podpora GPU, 1997: OpenGL 1.1 – prace ´ ı, 1998: OpenGL 1.2 – dalˇs´ı funkce pro texturovan´ ˇ rozˇs´ıˇren´ı texturovan´ ´ ı, 2001: OpenGL 1.3 – pˇrekvapiveˇ opet ´ ı a opet ˇ textury, 2002: OpenGL 1.4 – HW st´ınovan´ ´ 2003: OpenGL 1.5 – zejmena Vertex Buffer Objects ´ ı, (VBOs) a zlepˇsen´ı st´ınovan´ 2004: OpenGL 2.0 – plnohodnotna´ podpora GPU (jazyk ´ ARB – poˇcatek vertex a pixel shaders), zaˇc´ına´ silna´ orientace na vyuˇzit´ı graf. karet, 2006: OpenGL 2.1 – Pixel Buffer Objects, sRGB textury a GL Shading Language 1.20.
Graficke´ knihovny
Strana 7 / 25
ˇ Soucasnost OpenGL 2008: OpenGL 3.0 podporovane´ karty: Radeon HD series; GeForce 8, 9, 100-series, 200-series, 300-series and 400-series ´ an ´ objektov´y model, kter´y nepˇriˇsel, oˇcekav pro zjednoduˇsen´ı budouc´ıch verz´ı OpenGL byl pˇredstaven seznam nedoporuˇcovan´ych funkc´ı – deprecation mechanism, ´ ı mimo jine: ´ GLSL 1.30, Vertex Array Objects, pˇrichaz´ ´ Framebuffer Objects a dalˇs´ı funkce orientovane´ vylepˇsene, na vyuˇzit´ı graf. hardwaru.
2009: OpenGL 3.1 nove´ funkce pro jednoduˇssˇ ´ı v´yvoj, GLSL 1.40, ˇrada zastaral´ych funkc´ı vyˇrazena ze specifikace (reˇzim indexovan´ych barev, atp.), dostupne´ v rozˇs´ıˇren´ı.
Graficke´ knihovny
Strana 8 / 25
ˇ Soucasnost OpenGL (2) 2009: OpenGL 3.2 podporovane´ karty: Radeon HD series; GeForce 8000, 9000, GT 100, GTX 200, GT 300 and GTX 400 series GLSL 1.50 a dalˇs´ı zlepˇsovan´ı shaderu, ˚
2010: OpenGL 3.3 ´ specifikace vydana paralelneˇ s OpenGL 4, ˇrada ARB rozˇs´ıˇren´ı, ktere´ umoˇznuj´ ˇ ı funkcionalitu OpenGL 4 na starˇs´ım HW (OpenGL 4 vyˇzaduje nov´y hardware), GLSL 3.30.
Graficke´ knihovny
Strana 9 / 25
ˇ Soucasnost OpenGL (3) 2010: OpenGL 4.0 podporovane´ karty: Nvidia GeForce GTX 400 series, ATI Radeon HD 5000 series, ´ ı v´ykonu a funkcionality GLSL 4.00, dalˇs´ı zlepˇsovan´ shaderu, ˚
2010: OpenGL 4.1 plna´ kompatibilita s OpenGL for Embedded Systems – OpenGL ES 2.0 GLSL 4.10, dalˇs´ı zlepˇsen´ı v´ykonu a funkcionality, konkurence Direct3D 11.
Podrobnosti na: http://en.wikipedia.org/wiki/OpenGL, http://www.opengl.org/documentation/specs/.
Graficke´ knihovny
Strana 10 / 25
Khronos Group Od roku 1992 dohl´ızˇ ´ı na v´yvoj OpenGL Architecture Review Board (ARB), ´ ı Khronos Group Od roku 2006 ARB souˇcast´ (http://www.khronos.org), ´ kdokoliv (nekolik ˇ Do KG se muˇ urovn´ ı cˇ lenstv´ı, ´ ˚ ze pˇrihlasit ˇ podm´ıneno poplatkem), promoted members: AMD, ARM, Apple, Epic Games, Ericsson, Freescale, Imagination, Intel, Nokia, NVIDIA, Qualcomm, Samsung, Sony, Texas Instruments. KG dohl´ızˇ ´ı na v´yvoj rˇady standardu: ˚ OpenGL, OpenCL, OpenGL ES, OpenGL SC (Safety Critical), COLLADA, WebGL1 , OpenKODE, OpenVG, OpenMAX, OpenSL ES, OpenWF, OpenML. 1
´ OpenGL ES 2.0 v ramci HTML 5
Graficke´ knihovny
Strana 11 / 25
ˇ ˇ ıc´ı OpenGL Nekter e´ knihovny doplnuj´ ˇ GLU – doplnkov e´ funkce pro OpenGL, GLUT – The OpenGL utility toolkit, zastaven´y v´yvoj, freeglut – open source varianta GLUTu, GLUI – a GUI toolkit postaven´y na GLUTu, SDL – The Simple DirectMedia Layer, GLee – The OpenGL Easy Extension library, GLEW – The OpenGL Extension Wrangler Library, GLM – matematick´y toolkit postaven´y na GLSL.
´ ı rastroveho ´ Vykreslovan´ obrazu
ˇ Obsah pˇredna´ sky 1
Graficke´ knihovny
2
´ ı rastroveho ´ Vykreslovan´ obrazu
3
OpenGL aplikace
4
Shrnut´ı
Strana 12 / 25
´ ı rastroveho ´ Vykreslovan´ obrazu
Strana 13 / 25
´ ı sceny ´ Vykreslovan´ ˇ Rendering pipeline (vykreslovac´ı ˇretezec): Na vstupu jsou ´ objekty na v´ystupu je 2D rastr, (vektorove´ a rastrove) ˇ do ktere´ OpenGL renderuje obraz, framebuffer: pamet, ´ ı urychlilo, pouˇz´ıvaj´ı se 2 graficke´ aby se vykreslovan´ buffery pro jeden grafick´y v´ystup – obsah jednoho je ´ a do druheho ´ ´ dalˇs´ı sn´ımek, zobrazovan je pˇripravovan prof. graficke´ karty se 2 v´ystupy maj´ı tedy 4 buffery (NVIDIA Quadro).
´ ı rastroveho ´ Vykreslovan´ obrazu
Strana 14 / 25
´ ı sceny ´ ˇ Vykreslovan´ – podrobneji 1
´ z graf. primitiv, Konstrukce sceny
2
nastaven´ı pozorovatele (view point),
3 4
´ v´ypoˇcet barev objektu˚ (explicitn´ı nebo pˇrenesena), ´ rasterizace sceny,
5
pˇrenos do framebufferu.
´ ı rastroveho ´ Vykreslovan´ obrazu
´ ı sceny ´ ´ Vykreslovan´ – detailn´ı schema
´ Prozat´ım nen´ı nutne´ chapat
Strana 15 / 25
OpenGL aplikace
ˇ Obsah pˇredna´ sky 1
Graficke´ knihovny
2
´ ı rastroveho ´ Vykreslovan´ obrazu
3
OpenGL aplikace
4
Shrnut´ı
Strana 16 / 25
OpenGL aplikace
Strana 17 / 25
´ Zakladn´ ı struktura OpenGL aplikace V hlavn´ı funkci programu se zaregistruj´ı funkce pro ´ zakladn´ ı operace a ty se volaj´ı dle potˇreby automaticky. ˇ povinne´ jsou pouze Funkce se mohou jmenovat libovolne, parametry. Kaˇzdou funkci registrujeme pˇr´ısluˇsn´ym pˇr´ıkazem (viz n´ızˇ e). ´ ´ ´ Zakladn´ ı udalosti jsou zejmena: ˇ zmena velikosti okna – glutReshapeFunc(), ´ ´ stisknut´ı klavesy na klavesnici – glutKeyboardFunc(), stisknut´ı tlaˇc´ıtka myˇsi – glutMouseFunc(), 4 pohyb myˇ ´ tlaˇc´ıtku – glutMotionFunc(), s´ı pˇri stisknutem 5 vyprˇ sen´ı poˇc´ıtadla – glutTimerFunc(). 1 2 3
ˇ ´ Po techto udalostech se obvykle vola´ funkce pˇrekreslen´ı ´ okna (zaregistrovana pomoc´ı glutDisplayFunc()).
OpenGL aplikace
Strana 18 / 25
´ Zakladn´ ı struktura OpenGL aplikace 1 2 3
void display ( void ){ // vykresleni obsahu okna }
4 5 6 7 8
void init ( void ) { glClearColor (0.0 , 0.0 , 0.0 , 0.0); ... }
9 10 11 12 13 14 15 16 17 18 19 20
int main ( int argc , char ** argv ){ glutInit (& argc , argv ); g l u t I n i t D i s p l a y M o d e ( GLUT_SINGLE | g l u t I n i t W i n d o w S i z e (640 , 480); g l u t I n i t W i n d o w P o s i t i o n (100 , 100); g l u t C r e a t e W i n do w ( " PG2 " ); init (); g lu tDis p la yF un c ( display ); glutMainLoop (); return 0; }
// inicializace aplikace GLUT_RGBA ); // rezim // definice okna // // // // //
vytvoreni okna pocatecni nastaveni registrace funkce nekonecna smycka toto se nikdy neprovede
OpenGL aplikace
Strana 19 / 25
´ Registrace funkce pro stisk klavesy 1 2 3 4 5 6 7 8
void onKeyboard ( unsigned char key , int x , int y ){ switch ( key ){ case ’r ’: g_red =1.0; break ; case ’g ’: g_green =1.0; break ; case ’b ’: g_blue =1.0; break ; } g l u t P o s t R e d i s p l a y (); // prikaz zneplatnujici obsah okna }
9 10
...
11 12 13 14 15 16
int main ( int argc , char ** argv ){ ... // registrace funkce pro stisk klavesy g l u t K e y b o a r d F u n c t ( onKeyboard ); }
OpenGL aplikace
Strana 20 / 25
Struktura OpenGL pˇr´ıkazu˚ glColor3f(0.0f, 1.0f,0.0f) Kaˇzd´y pˇr´ıkaz ma´ prefix gl, glu, glut. ´ ´ Nasleduje nazev pˇr´ıkazu. ´ Nasleduje poˇcet a typ pˇredan´ych parametru˚ (byte, short int, int, double, unsigned varianty pˇredchoz´ıch). // priklady moznosti nastaveni barvy vykreslovani glColor3f(0.0f, 1.0f, 0.0f) glColor3i(0, 255, 0) glColor4f(0.5f, 0.0f, 1.0f, 0.0f)
OpenGL aplikace
Strana 21 / 25
Datove´ typy OpenGL ´ ıme kvuli Zavad´ ˚ pˇrenositelnosti, ale lze pouˇz´ıvat i nativn´ı typy GLbyte: 8b, b GLshort: 16b, s GLint: 32b, i GLint64: 32b, i64 GLfloat: 32b, f GLdouble: 64b, d ... ´ Existuj´ı i varianty bez znamenka (pˇrirozena´ cˇ ´ısla) GLubyte: 8b, ub GLushort: 16b, us GLuint: 32b, ui
OpenGL aplikace
Stavovy´ automat 1 2
// zacni vykreslovat urcitou barvou glColor3f (0.0 f , 1.0 f , 0.0 f );
3 4 5 6 7 8 9 10 11 12
// zacny vytvaret vrcholy glBegin ( typ_primitiva ); glVertex3f (...); glVertex3f (...); ... // konec vkladani vrcholu glEnd (); // zmen barvu vykreslovani glColor3f (1.0 f , 1.0 f , 0.5 f );
Strana 22 / 25
OpenGL aplikace
Strana 23 / 25
Detekce chyby ´ ı NO ERROR, je vˇse v Pokud funkce enum glGetError(void) vrat´ ´ ´ ı nastala chyba, poˇradku. Pokud v dobeˇ od pˇredchoz´ıho volan´ ´ ´ vrat´ı jedna z nasleduj´ıch hodnot. ´ GL INVALID ENUM – prvek neodpov´ıda´ v´ycˇ tovemu typu, GL INVALID VALUE – cˇ ´ıseln´y parametr mimo rozsah, GL INVALID OPERATION – operace nen´ı povolena, GL INVALID FRAMEBUFFER OPERATION – objekt ve framebufferu nen´ı kompletn´ı, GL STACK OVERFLOW, GL STACK UNDERFLOW – obvykle u maticov´ych operac´ı, GL TABLE TOO LARGE – generuje OpenGL imaging subset, ´ GL OUT OF MEMORY – zˇrejme. Vhodne´ pravidelneˇ kontrolovat!
Shrnut´ı
ˇ Obsah pˇredna´ sky 1
Graficke´ knihovny
2
´ ı rastroveho ´ Vykreslovan´ obrazu
3
OpenGL aplikace
4
Shrnut´ı
Strana 24 / 25
Shrnut´ı
Strana 25 / 25
´ Kontroln´ı otazky Jak´y je rozd´ıl mezi DirectX, OpenGL, XNA a Open Inventorem? ´ Jaka´ je zakladn´ ı struktura OpenGL aplikace? Jak zajistit ´ reakci na stisk klavesy? ´ a´ pˇr´ıkaz glColor3i()? Jake´ parametry oˇcekav Jak detekovat chybu v OpenGL aplikaci?