Programování grafiky ÚVOD Petr Felkel Katedra počítačové grafiky a interakce, ČVUT FEL místnost KN:E-413 (Karlovo náměstí, budova E) E-mail: felkel@fel.cvut.cz S použitím materiálů Bohuslava Hudce, Jaroslava Sloupa, Ondřeje Karlíka a Vlastimila Havrana Poslední změna: 3.3.2016
Cíle předmětu programování grafiky () Porozumět základům počítačové grafiky Umět naprogramovat interaktivní aplikace v OpenGL Nezávislé na platformě (PC / Mac / vestavné systémy / web, )
Organizace Přednášky Teorie počítačové grafiky základy pro grafické aplikace běžící v reálném čase (real time) Syntéza obrazu s použitím OpenGL od verze 3.1 Demonstrační příklady a kódy jednotlivých technik Cvičení Detaily o OpenGL a GLSL Jednoduché úlohy Semestrální projekt (program, web, prezentace) Podrobnosti na webu předmětu https://cent.felk.cvut.cz/courses//
Ukázky semestrálních prací
Dělení počítačové grafiky dle účelu [Karlík] 2D grafika DTP noviny, časopisy Grafická uživatelská rozhraní- GUI Výkresová dokumentace 3D grafika [Karlík] Vizualizace Filmová grafika Realtime grafika - hry http://www.cs.utah.edu/npr/
Vizualizace Reklama, vizualizace produktů, architektury jediný obrázek Fotorealismus x photoshop Dlouhý čas na obrázek (dny až týdny) [Karlík]
Filmová grafika Obrovský rozsah dat (modely, textury, ) 24 obrázků / s, dlouhý výpočetní čas na obrázek (hodiny až dny) Umělecká kontrola nad výsledkem (ne vždy fotorealismus) RenderMan + studia vyvíjejí vlastní SW [Karlík]
Realtime grafika Malý počet polygonů (hrubá dutá slupka tělesa) Rasterizace, 30+ FPS, ~20ms na obrázek GPU Fake [Karlík]
Obrázek, pixely a antialiasing Obrázek Omezené rozlišení (Daný počet pixelů) Zubaté okraje, artefakty Nutno vyhlazovat bez vyhlazování s vyhlazováním
Geometrické modelování x zobrazování Modelování často komplexní plochy Zobrazování trojúhelníky ve 3D (teselace)
Textury
Základ syntézy obrazu
Problém viditelnosti
Negeometrické vlastnosti objektů
Různá kvalita syntetizovaného obrazu (obrázky fy PIXAR) Polygonální model drátové zobrazení Polygonální model drátové zobrazení s viditelností
Různá kvalita syntetizovaného obrazu (obrázky fy PIXAR) II Polygonální model konstantní stínování Polygonální model interpolované stínování Mapování textur Stíny
Vztah počítačové grafiky a vidění Vymezení pojmu počítačová grafika počítačová geometrie objektový prostor počítačové vidění obrazový prostor zpracování obrazu Počítačová grafika transformace dat z objektového (3D) do obrazového prostoru (2D) Počítačová geometrie zpracování geometrických a topologických dat v objektovém prostoru Zpracování obrazu Zpracování nestrukturovaných rastrových obrázků (zlepšování kvality obrazu, vyhledávání obrysů,..) Počítačové vidění Na základě analýzy obrazu se hledají objekty a vztahy mezi objekty v objektovém prostoru.
Velmi hrubý pohled na grafický HW HOST Grafika Monitor CPU MEM GPU VIDEOMEM CPU dodá data Grafika je zpracuje a uloží do paměti obrazu Z paměti obrazu se posílají do monitoru
Host HOST CPU MEM Připraví data balíky vrcholů + konektivita textury Připraví programy pro GPU - shadery Pošle vše na grafickou kartu Nastaví stav OpenGL Posílá příkazy kresli C/C++ OpenGL Obsluhuje interakci s uživatelem (klávesnice, myš) Řídí animace,
Grafika Grafika GPU VIDEOMEM GLSL Přijímá data a nastavení od hosta Ukládá je do své grafické paměti Je to hierarchie pamětí Videopaměť cache L1, L2 registry 60x za sekundu Smaže obrazovou paměť vykreslí obraz Pracuje paralelně Po vrcholech, primitivech, fragmentech Spouští na ně shadery
Obrazová paměť Grafika GPU VIDEOMEM Obrazová paměť = framebuffer Ukládá vykreslený obraz Má více vrstev: Barvu, hloubku, Čte se z ní obraz do monitoru - 60x za sekundu Problémy propustnosti (bandwidth), současného čtení, latence paměti (=>cache),
Problém propustnosti sběrnice HOST Grafika Monitor CPU MEM GPU VIDEOMEM Omezený datový tok ~8 GB/s (PCI Express v 2.0, 16 linek) Video ~0,3 GB/s (1920x1080, 60FPS) Dat ke generování obrazu je mnohem více: Geometrie (300 mil. tr., 50FPS => 10.2 GB/s, Textury, => Maximum dat předem na grafickou kartu a na ní grafické výpočty
Typické zřetězení grafických operací graphics pipeline [http://open.gl/drawing]
Typické zřetězení grafických operací graphics pipeline Vertex Data Pixel Data Vertex processing Texture Store Primitive Assembly and Rasterization Fragment Processing Fragment operations
Architektura grafického systému Grafický HW se vyvíjel od konce ~1991 První byl HW rasterizátor (pixelů je nejvíc) 1999 Poté geometrie (vertex processing) HW transform & lighting (T&L) - GeForce 256 fix-pipeline byla omezením 2000 shadery => GPU lze programovat dataflow architektura výpočet se spustí, když dorazí data na rozdíl od CPU, které je sériové, řízeno programem data nevědí nic o sousedech 2006 unifikované procesory (streaming processor) ~2007 Použití GPU pro negrafické výpočty GPGPU CUDA, CTM, OpenCL,
Hrubé schéma OpenGL se shadery Vertex Data Pixel Data Vertex Shader Texture Store Primitive Assembly and Rasterization Fragment Shader Fragment operations OpenGL verze 3.1 Každá aplikace definuje dva programy (tzv. shadery): vertex shader (VS) program zapsaný v jazyku GLSL zpracovává každý vrchol fragment shader (FS) program zapsaný v GLSL zpracovává tzv. fragment
Grafická rozhraní, knihovna OpenGL, GLUT
Co je OpenGL? Grafická knihovna (Open Graphics Library) API = SW rozhraní k rastrovému grafickému HW nezávislé na OS a na použitém HW poskytuje nástroje na vykreslení 3D dat a textur do 2D nestará se o okna, události, formáty souborů, Odnože OpenGL WebGL pro web OpenGL ES pro mobily, navigace,
Co je OpenGL? minimální knihovna geometrická primitiva (body, úsečky, trojúhelníky, pásy troj. ) obrazová primitiva (rastrové obrázky) textury předává balíky dat grafické kartě (GPU) vrcholy primitiv - základem všech primitiv je bod textury programy (shadery) zapíná a vypíná jednotlivé funkce
Výhody OpenGL Jednoduchost Konzistentní implementace & design Rozsáhlá dokumentace Přenositelnost Další rozvoj je dán konsorciem firem Otevřenost a rozšiřitelnost!! výrobci HW mohou rozšiřovat funkcionalitu sami (viz GL Extensions) např. v Direct3D je všechno vydáno na milost a nemilost Microsoftu, který jediný spravuje a aktualizuje Direct3D
Knihovny kolem OpenGL (1) Aplikace závislá na operačním systému aplikační program Operační systém X, Win32, Mac O/S OpenGL ovladače hardware (periferie, GPU, ) Courtesy Siggraph2004 Course 29
Knihovny kolem OpenGL (2) Aplikace nezávislá na operačním systému aplikační program Správa oken, GUI Operační systém X, Win32, Mac O/S OpenGL ovladače hardware (periferie, GPU, ) Courtesy Siggraph2004 Course 29
Knihovny kolem OpenGL (3) Správa oken / GUI GLUT FreeGLUT SDL
Evoluce OpenGL 1994 - OpenGL 1.0 - fixní proudové zpracování ( fixed pipeline ) 2004 - OpenGL 2.0 - programovatelnost pomocí tzv. shaders 2008 - OpenGL 3.0 - zavedení dopředné kompatibility a možnosti zrušit staré funkce 2009 - OpenGL 3.1 - kompletně odstraněno fixní proudové zpracování, nutnost použití shaders 2010 - OpenGL 4.0 - řízení teselace přímo na GPU, volání funkcí (podprogramů), externí API, atd. 2014 - OpenGL 4.5 - podpora vícevláknových aplikací, robustnost, emulace DX11, atd. 2016 Vulkan 1.0 portabilita desktopy - mobilní zařízení Podrobněji zpracováno na: http://en.wikipedia.org/wiki/opengl
OpenGL 3.1, březen 2009 Vertex Data Vertex Shader Primitive Setup and Rasterization Fragment Shader Blending Pixel Data Texture Store
OpenGL 3.2, srpen 2009 Vertex Data Vertex Shader Geometry Shader Primitive Setup and Rasterizati on Fragment Shader Blending Pixel Data Texture Store
OpenGL 4.1, březen 2010 Vertex Data Vertex Shader Tessellation Control Shader Tessellation Evaluation Shader Geometry Shader Primitive Setup and Rasterization Fragment Shader Blending Pixel Data Texture Store
Kontext a profily OpenGL Profily (context profiles) Od verze > 3.0 Určují verzi OpenGL a množinu použitelných příkazů Dva typy profilu core a compatible Context Type Profile Description Full Forward Compatible core compatible core compatible Všechny funkce dané verze OpenGL (i ty, označené jako zavržené, ale bez zrušených funkcí) Všechny funkce ze všech předchozích verzí OpenGL (full v OpenGL 3.0) Pouze nezavržené funkce dané verze OpenGL Není podporován
Syntaxe příkazů v OpenGL Konstanty ( Constants ) Velká písmena, prefix GL_ Například: GL_COLOR_BUFFER_BIT, GL_DEPTH_TEST Datové typy Malá písmena s prefixem GL Například: GLfloat, GLbyte Volání procedur a funkcí: Malá písmena, první velké, prefix gl Například: glcreateprogram() Datový typ parametrů (další slajd) suffix Parametry oddělené čárkou gl<command name>[<num> <type> [v]]( parameter(s) ); prefix gl př. gluniform1f( index, 5.8f); double attrib_array[3] = {1.0, 5.0, 6.0}; gluniform3fv (index, attrib_array); Počet parametrů - celé číslo v pokud je parametrem ukazatel do pole
Datové typy parametrů příkazů Suffix Datový typ Datový typ v ANSI C OpenGL definice b 8bit integer signed char GLbyte s 16bit integer short GLshort i 32bit integer long GLint, GLsizei i64 64bit integer (long long, _int64) GLint64 f 32bit float float GLfloat, GLclampf d 64bit float double GLdouble, GLclampd ub 8bit unsigned int unsigned char GLubyte, GLboolean us 16bit unsigned int unsigned short GLushort ui 32bit unsigned int unsigned long GLunit, GLenum, GLbitfield ui64 64bit unsigned int GLunit64
OpenGL jako automat (state machine) OpenGL je automat v každém okamžiku má definován svůj vnitřní stav proto ne stavový automat!!! Vnitřní stav je definován hodnotami vnitřních proměnných Pokud je nezměníme, mají své iniciální hodnoty Tyto proměnné lze nastavovat a ptát se na jejich hodnotu Např. zapnutí hloubkového testu
Nastavení a získání hodnoty stavové proměnné Nastavení stavu logická hodnota glenable(gl_multisample); gldisable(gl_multisample); Získání stavu bool glisenabled(gl_cull_face); Získání stavu jedné či více hodnot: glgetbooleanv(glenum pname, GLboolean * params); glgetfloatv( GLenum pname, GLfloat * params); glgetintegerv(glenum pname, GLint * params); glgetdoublev( GLenum pname, GLdouble * params);
Zpracování chyb v OpenGL GLenum glgeterror(void); OpenGL detekuje jen minimum z možných chyb Kontrola všeho by byla příliš časově náročná Zapamatuje si první chybu, která nastala Každá chyba má svůj vlastní číselný kód a jemu přiřazenou symbolickou konstantu: GL_NO_ERROR no problem, OK GL_INVALID_ENUM enum value out of range. GL_INVALID_VALUE numeric argument is out of range GL_INVALID_OPERATION illegal operation in current state GL_INVALID_FRAMEBUFFER_OPERATION offending command for current state GL_OUT_OF_MEMORY not enough memory to execute the command
Zpracování chyb v OpenGL OpenGL Debug extension Od OpenGL 4.3. v jádře Mechanismus nahrazující glgeterror() Zavádí dva přístupy Frontu ladících zpráv (message log) Mechanizmus zpětných volání pro vybrané chyby (callbacks)
OpenGL odkazy http://www.opengl.org/ dokumentace, odkazy na programy, http://www.khronos.org/ vývoj, schvalování implementací (OpenGL compliant) http://www.sgi.com/ licence pro HW Ondřej Karlík - Corona renderer: Making of productionready renderer in 3dsMAX, Přednáška, Speciální seminář z počítačové grafiky, 20. 10. 2011