24. září 2013, Brno Připravil: David Procházka Základy OpenGL Počítačová grafika 2
Grafické knihovny Strana 2 / 25 Obsah přednášky 1 Grafické knihovny 2 Vykreslování rastrového obrazu 3 OpenGL aplikace 4 Shrnutí
Grafické knihovny Strana 3 / 25 Grafické knihovny a jejich význam Každý si může napsat svou grafickou knihovnu. Má však význam pouze tehdy pokud je podporována výrobci grafických karet. Dnes jsou běžně HW podporovány pouze Microsoft DirectX a OpenGL. Existují další knihovny/enginy, které jsou postaveny na OpenGL/DirectX (XNA, Open Inventor). Jejich účelem je usnadnit vývoj grafických aplikací. Tyto knihovny generují obvykle optimalizovaný OpenGL resp. DirectX kód. Jejich použití může zvýšit (ale nemusí!) výkon aplikace.
Grafické knihovny Strana 4 / 25 Význam hardwarové akcelerace
Grafické knihovny Strana 5 / 25 OpenGL API pro tvorbu 2D a 3D graf. aplikací (podobné Direct3D, DirectX je komplexnější), nezávislá na platformě nebo jazyku (DirectX je pouze pro Windows), OpenGL je procedurální, lze však vytvářet objektové aplikace (DirectX je plně objektový), vše je vykreslováno z graf primitiv (bod, linie, polygon, pixmapa, bitmapa), OpenGL je stavový stroj (pokud nastavíte, že plochy mají mít určitou barvu, bude to platit do odvolání), OpenGL používá knihovnu GLUT (OpenGL Utility Toolkit) pro tvobu GUI a zjednodušení některých operací, součástí OpenGL je GL Shanding Language (GLSL), který umožňuje provádět řadu operací na grafické kartě.
Grafické knihovny Strana 6 / 25 Velmi stručná historie OpenGL 1980: Iris GL Silicon Graphics, SGI stanice, 1992: OpenGL 1.0 Mark Segal and Kurt Akeley, 1997: OpenGL 1.1 práce s texturami, podpora GPU, 1998: OpenGL 1.2 další funkce pro texturování, 2001: OpenGL 1.3 překvapivě opět rozšíření texturování, 2002: OpenGL 1.4 HW stínování a opět textury, 2003: OpenGL 1.5 zejména Vertex Buffer Objects (VBOs) a zlepšení stínování, 2004: OpenGL 2.0 plnohodnotná podpora GPU (jazyk ARB počátek vertex a pixel shaders), začíná silná orientace na využití graf. karet, 2006: OpenGL 2.1 Pixel Buffer Objects, srgb textury a GL Shading Language 1.20.
Grafické knihovny Strana 7 / 25 Současnost OpenGL 2008: OpenGL 3.0 podporované karty: Radeon HD series; GeForce 8, 9, 100-series, 200-series, 300-series and 400-series očekáván objektový model, který nepřišel, pro zjednodušení budoucích verzí OpenGL byl představen seznam nedoporučovaných funkcí deprecation mechanism, přichází mimo jiné: GLSL 1.30, Vertex Array Objects, vylepšené, Framebuffer Objects a další funkce orientované na využití graf. hardwaru. 2009: OpenGL 3.1 nové funkce pro jednodušší vývoj, GLSL 1.40, řada zastaralých funkcí vyřazena ze specifikace (režim indexovaných barev, atp.), dostupné v rozšíření.
Grafické knihovny Strana 8 / 25 Současnost OpenGL (2) 2009: OpenGL 3.2 podporované karty: Radeon HD series; GeForce 8000, 9000, GT 100, GTX 200, GT 300 and GTX 400 series GLSL 1.50 a další zlepšovaní shaderů, 2010: OpenGL 3.3 specifikace vydána paralelně s OpenGL 4, řada ARB rozšíření, které umožňují funkcionalitu OpenGL 4 na starším HW (OpenGL 4 vyžaduje nový hardware), GLSL 3.30.
Grafické knihovny Strana 9 / 25 Současnost OpenGL (3) 2010: OpenGL 4.0 podporované karty: Nvidia GeForce GTX 400 series, ATI Radeon HD 5000 series, GLSL 4.00, další zlepšování výkonu a funkcionality shaderů, 2010: OpenGL 4.1 plná kompatibilita s OpenGL for Embedded Systems OpenGL ES 2.0 GLSL 4.10, další zlepšení výkonu a funkcionality, konkurence Direct3D 11. Podrobnosti na: http://en.wikipedia.org/wiki/opengl, http://www.opengl.org/documentation/specs/.
Grafické knihovny Strana 10 / 25 Khronos Group Od roku 1992 dohlíží na vývoj OpenGL Architecture Review Board (ARB), Od roku 2006 ARB součástí Khronos Group (http://www.khronos.org), Do KG se může přihlásit kdokoliv (několik úrovní členství, podmíněno poplatkem), promoted members: AMD, ARM, Apple, Epic Games, Ericsson, Freescale, Imagination, Intel, Nokia, NVIDIA, Qualcomm, Samsung, Sony, Texas Instruments. KG dohlíží na vývoj řady standardů: OpenGL, OpenCL, OpenGL ES, OpenGL SC (Safety Critical), COLLADA, WebGL 1, OpenKODE, OpenVG, OpenMAX, OpenSL ES, OpenWF, OpenML. 1 OpenGL ES 2.0 v rámci HTML 5
Grafické knihovny Strana 11 / 25 Některé knihovny doplňující OpenGL GLU doplňkové funkce pro OpenGL, GLUT The OpenGL utility toolkit, zastavený vývoj, freeglut open source varianta GLUTu, GLUI a GUI toolkit postavený na GLUTu, SDL The Simple DirectMedia Layer, GLee The OpenGL Easy Extension library, GLEW The OpenGL Extension Wrangler Library, GLM matematický toolkit postavený na GLSL.
Vykreslování rastrového obrazu Strana 12 / 25 Obsah přednášky 1 Grafické knihovny 2 Vykreslování rastrového obrazu 3 OpenGL aplikace 4 Shrnutí
Vykreslování rastrového obrazu Strana 13 / 25 Vykreslování scény Rendering pipeline (vykreslovací řetězec): Na vstupu jsou (vektorové a rastrové) objekty na výstupu je 2D rastr, framebuffer: pamět, do které OpenGL renderuje obraz, aby se vykreslování urychlilo, používají se 2 grafické buffery pro jeden grafický výstup obsah jednoho je zobrazován a do druhého je připravován další snímek, prof. grafické karty se 2 výstupy mají tedy 4 buffery (NVIDIA Quadro).
Vykreslování rastrového obrazu Strana 14 / 25 Vykreslování scény podrobněji 1 Konstrukce scény z graf. primitiv, 2 nastavení pozorovatele (view point), 3 výpočet barev objektů (explicitní nebo přenesená), 4 rasterizace scény, 5 přenos do framebufferu.
Vykreslování rastrového obrazu Strana 15 / 25 Vykreslování scény detailní schéma Prozatím není nutné chápat
OpenGL aplikace Strana 16 / 25 Obsah přednášky 1 Grafické knihovny 2 Vykreslování rastrového obrazu 3 OpenGL aplikace 4 Shrnutí
OpenGL aplikace Strana 17 / 25 Základní struktura OpenGL aplikace V hlavní funkci programu se zaregistrují funkce pro základní operace a ty se volají dle potřeby automaticky. Funkce se mohou jmenovat libovolně, povinné jsou pouze parametry. Každou funkci registrujeme příslušným příkazem (viz níže). Základní události jsou zejména: 1 změna velikosti okna glutreshapefunc(), 2 stisknutí klávesy na klávesnici glutkeyboardfunc(), 3 stisknutí tlačítka myši glutmousefunc(), 4 pohyb myší při stisknutém tlačítku glutmotionfunc(), 5 vypršení počítadla gluttimerfunc(). Po těchto událostech se obvykle volá funkce překreslení okna (zaregistrovaná pomocí glutdisplayfunc()).
OpenGL aplikace Strana 18 / 25 Základní struktura OpenGL aplikace 1 void display ( void ){ 2 // vykresleni obsahu okna 3 } 4 5 void init ( void ) { 6 glclearcolor (0.0, 0.0, 0.0, 0.0); 7... 8 } 9 10 int main ( int argc, char ** argv ){ 11 glutinit (& argc, argv ); // inicializace aplikace 12 glutinitdisplaymode ( GLUT_SINGLE GLUT_RGBA ); // rezim 13 glutinitwindowsize (640, 480); // definice okna 14 glutinitwindowposition (100, 100); 15 glutcreatewindow (" PG2 "); // vytvoreni okna 16 init (); // pocatecni nastaveni 17 glutdisplayfunc ( display ); // registrace funkce 18 glutmainloop (); // nekonecna smycka 19 return 0; // toto se nikdy neprovede 20 }
OpenGL aplikace Strana 19 / 25 Registrace funkce pro stisk klávesy 1 void onkeyboard ( unsigned char key, int x, int y){ 2 switch ( key ){ 3 case r : g_red =1.0; break ; 4 case g : g_green =1.0; break ; 5 case b : g_blue =1.0; break ; 6 } 7 glutpostredisplay (); // prikaz zneplatnujici obsah okna 8 } 9 10... 11 12 int main ( int argc, char ** argv ){ 13... 14 // registrace funkce pro stisk klavesy 15 glutkeyboardfunct ( onkeyboard ); 16 }
OpenGL aplikace Strana 20 / 25 Struktura OpenGL příkazů glcolor3f(0.0f, 1.0f,0.0f) Každý příkaz má prefix gl, glu, glut. Následuje název příkazu. Následuje počet a typ předaných parametrů (byte, short int, int, double, unsigned varianty předchozí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 Datové typy OpenGL Zavádíme kvůli přenositelnosti, ale lze použí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 znaménka (přirozená čísla) GLubyte: 8b, ub GLushort: 16b, us GLuint: 32b, ui
OpenGL aplikace Strana 22 / 25 Stavový automat 1 // zacni vykreslovat urcitou barvou 2 glcolor3f (0.0f, 1.0f, 0.0 f); 3 4 // zacny vytvaret vrcholy 5 glbegin ( typ_primitiva ); 6 glvertex3f (...); 7 glvertex3f (...); 8... 9 // konec vkladani vrcholu 10 glend (); 11 // zmen barvu vykreslovani 12 glcolor3f (1.0f, 1.0f, 0.5 f);
OpenGL aplikace Strana 23 / 25 Detekce chyby Pokud funkce enum glgeterror(void) vrátí NO ERROR, je vše v pořádku. Pokud v době od předchozího volání nastala chyba, vrátí jedna z následujích hodnot. GL INVALID ENUM prvek neodpovídá výčtovému typu, GL INVALID VALUE číselný 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ých operací, GL TABLE TOO LARGE generuje OpenGL imaging subset, GL OUT OF MEMORY zřejmé. Vhodné pravidelně kontrolovat!
Shrnutí Strana 24 / 25 Obsah přednášky 1 Grafické knihovny 2 Vykreslování rastrového obrazu 3 OpenGL aplikace 4 Shrnutí
Shrnutí Strana 25 / 25 Kontrolní otázky Jaký je rozdíl mezi DirectX, OpenGL, XNA a Open Inventorem? Jaká je základní struktura OpenGL aplikace? Jak zajistit reakci na stisk klávesy? Jaké parametry očekává příkaz glcolor3i()? Jak detekovat chybu v OpenGL aplikaci?