Upload
others
View
19
Download
0
Embed Size (px)
Citation preview
Programování grafikyÚVODPetr Felkel
Katedra počítačové grafiky a interakce, ČVUT FELmístnost KN:E-413 (Karlovo náměstí, budova E)
E-mail: [email protected] 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 (PGR)
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,…)
PGR
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ětuhttps://cent.felk.cvut.cz/courses/PGR/
PGR
Ukázky semestrálních prací
PGR
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• …
PGR 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)
PGR
[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
PGR
[Karlík]
Realtime grafika
Malý počet polygonů (hrubá dutá slupka tělesa) Rasterizace, 30+ FPS, ~20ms na obrázek GPU Fake
PGR
[Karlík]
Obrázek• Omezené rozlišení
(Daný počet pixelů)• Zubaté okraje, artefakty• Nutno vyhlazovat
Obrázek, pixely a antialiasing
bez vyhlazování s vyhlazováním
PGR
Geometrické modelování x zobrazování
Modelování – často komplexní plochyZobrazování – trojúhelníky ve 3D (teselace)
PGR
Textury
PGR
Základ syntézy obrazu
PGR
Problém viditelnosti
PGR
Negeometrické vlastnosti objektů
PGR
Různá kvalita syntetizovaného obrazu(obrázky fy PIXAR)
Polygonální model – drátové zobrazení Polygonální model –drátové zobrazení s viditelností
PGR
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
PGR
Vztah počítačové grafiky a vidění
Vymezení pojmu
Počítačová grafikatransformace dat z objektového (3D) do obrazového prostoru (2D)
Počítačová geometriezpracování geometrických a topologických dat v objektovém prostoru
Zpracování obrazuZpracová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 objektyv objektovém prostoru.
obrazový prostorobjektový
prostor
zpracování obrazu
počítačová grafika
počítačové vidění
počítačová geometrie
PGR
Velmi hrubý pohled na grafický HW
PGR
HOST
CPUMEM
Grafika
GPUVIDEOMEM
Monitor
CPU dodá dataGrafika je zpracuje a uloží do paměti obrazu
Z paměti obrazu se posílají do monitoru
Host
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
Obsluhuje interakci s uživatelem (klávesnice, myš)
Řídí animace, …PGR
HOST
CPUMEM
C/C++OpenGL
Grafika
PGR
Grafika
GPUVIDEOMEM
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
GLSL
Obrazová paměť
PGR
Grafika
GPUVIDEOMEM
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
PGR
HOST
CPUMEM
Grafika
GPUVIDEOMEM
Monitor
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
PGR [http://open.gl/drawing]
Typické zřetězení grafických operací –graphics pipeline
PrimitiveAssembly
and Rasterization
FragmentProcessing
Fragment operations
VertexData
PixelData
Vertexprocessing
TextureStore
PGR
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,…PGR
Hrubé schéma OpenGL se shadery
PrimitiveAssembly
and Rasterization
FragmentShader
Fragment operations
VertexData
PixelData
VertexShader
TextureStore
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
OpenGL verze 3.1
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, …
PGR
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
PGR
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
PGR
Knihovny kolem OpenGL (1)
OpenGL
aplikační program
Aplikace závislá na operačním systému
Operační systém X, Win32, Mac O/S
ovladače
Courtesy Siggraph2004 Course 29
hardware (periferie, GPU,…)
PGR
Knihovny kolem OpenGL (2)
Správa oken, GUI
OpenGLOperační systém X, Win32, Mac O/S
ovladače
aplikační program
Courtesy Siggraph2004 Course 29
Aplikace nezávislá na operačním systému
PGR
hardware (periferie, GPU,…)
Knihovny kolem OpenGL (3)
Správa oken / GUI GLUT FreeGLUT SDL …
PGR
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
PGR
OpenGL 3.1, březen 2009
PGR
FragmentShader Blending
VertexData
PixelData
VertexShader
TextureStore
PrimitiveSetup and
Rasterization
OpenGL 3.2, srpen 2009
PGR
FragmentShader Blending
VertexData
PixelData
VertexShader
TextureStore
GeometryShader
PrimitiveSetup and Rasterizati
on
OpenGL 4.1, březen 2010
PGR
PrimitiveSetup and
Rasterization
FragmentShader Blending
VertexData
PixelData
VertexShader
TextureStore
GeometryShader
TessellationControlShader
TessellationEvaluation
Shader
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“
PGR
Context Type Profile Description
Fullcore
Všechny funkce dané verze OpenGL (i ty, označené jako zavržené, ale bez zrušených funkcí)
compatible Všechny funkce ze všech předchozích verzí OpenGL (full v OpenGL 3.0)
Forward Compatible
core Pouze nezavržené funkce dané verze OpenGL
compatible 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()
gl<command name>[<num> <type> [v]]( parameter(s) );
př. glUniform1f( index, 5.8f);
double attrib_array[3] = {1.0, 5.0, 6.0};glUniform3fv (index, attrib_array);
prefix glPočet parametrů
- celé číslo
suffix
Datový typparametrů
(další slajd)Parametry
oddělené čárkou
“v” pokud je parametrem ukazatel do pole
PGR
Datové typy parametrů příkazů
Suffix Datový typ Datový typ v ANSI C OpenGL definice
b 8bit integer signed char GLbytes 16bit integer short GLshorti 32bit integer long GLint, GLsizei
f 32bit float float GLfloat, GLclampfd 64bit float double GLdouble, GLclampd
ub 8bit unsigned int unsigned char GLubyte, GLbooleanus 16bit unsigned int unsigned short GLushortui 32bit unsigned int unsigned long GLunit, GLenum, GLbitfield
i64 64bit integer GLint64
ui64 64bit unsigned int
(long long, _int64)
GLunit64
PGR
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
PGR
Nastavení a získání hodnoty stavové proměnné
Nastavení stavu – logická hodnota glEnable(GL_MULTISAMPLE);glDisable(GL_MULTISAMPLE);
Získání stavubool 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);
PGR
Zpracování chyb v OpenGL
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
GLenum glGetError(void);
PGR
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)
PGR
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 production-ready renderer in 3dsMAX, Přednáška, Speciální seminář z počítačové grafiky, 20. 10. 2011
PGR