Připravil: David Procházka. Shadery

Podobné dokumenty
Fakulta informačních technologíı. IZG cvičení 6. - Zobrazování 3D scény a základy OpenGL 1 / 38

Připravil: David Procházka. Vertex Buffer Objects

Programování shaderů GLSL

Android OpenGL. Práce s texturami

Fakulta informačních technologíı. Rendering Seminář 1. 1 / 28

27. listopadu 2013, Brno Připravil: David Procházka

Základy programování shaderů v OpenGL Část 2 - přenos dat

Připravil: David Procházka. Vykreslování grafických primitiv

Základy programování shaderů v OpenGL Část 2 - přenos dat

Základy programování shaderů v OpenGL část 1 program

Android OpenGL. Pokročilé shadery

NPGR019. Geometry & tessellation shaders. MFF UK Praha. Vykreslování v OpenGL Tessellation shaders Geometry shaders Literatura

Transformace (v OpenGL) příklady a knihovna GLM

Reflections, refractions, interreflections

Textury. Petr Felkel, Jaroslav Sloup a Vlastimil Havran

Základy OpenGL Josef Pelikán CGG MFF UK Praha. OpenGL / 34

Programovatelné shadery a jazyk Cg. Petr Kmoch

Algoritmizace a programování

TAM. Prezentace přednášek. Ústav počítačové grafiky a multimédií

Co je grafický akcelerátor

Programování v C++ 2, 4. cvičení

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

ak. rok 2013/2014 Michal Španěl,

Pokročilé architektury počítačů

Programování grafiky ÚVOD

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

Připravil: David Procházka. Základy OpenGL

Připravil: David Procházka. Projekce

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

8 Třídy, objekty, metody, předávání argumentů metod

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Hierarchický model Josef Pelikán CGG MFF UK Praha. 1 / 16

Hardware pro počítačovou grafiku NPGR019

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Západočeská univerzita v Plzni Fakulta aplikovaných věd Katedra informatiky a výpočetní techniky. haptického pera

PREPROCESOR POKRAČOVÁNÍ

Programování grafiky ÚVOD

Masivně paralelní zpracování obrazu v prostředí systému VisionLab Liberec Roman Cagaš, rc@mii.cz

Programovací jazyk Haskell

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

MATrixLABoratory letný semester 2004/2005

Programovací í jazyk Haskell

pi Ludolfovo číslo π = 3,14159 e Eulerovo číslo e = 2,71828 (lze spočítat jako exp(1)), např. je v Octave, v MATLABu tato konstanta e není

Programování v C++, 2. cvičení

Knihovna WebGraphLib

Šablony, kontejnery a iterátory

Pokročilé programování v jazyce C pro chemiky (C3220) 3D grafika v knihovně Qt

Programování v C++ 1, 5. cvičení

Úvodem... 9 Kapitola 1 Karetních

Základy programování (IZP)

Úvod do programovacích jazyků (Java)

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Základy programování (IZP)

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Lineární datové struktury

Textury v real-time grafice Josef Pelikán, MFF UK Praha Josef.Pelikan@mff.cuni.cz

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy

Šablony, kontejnery a iterátory

Univerzitní licence MATLABu. Pište mail na: se žádostí o nejnovější licenci MATLABu.

LabView jako programovací jazyk II

Knihovny pro programování PLC Tecomat podle IEC

Programování v C++ 3, 3. cvičení

Dokumentace ke knihovně InsDevice

Rád bych poděkoval Ing. Davidu Ambrožovi za jeho cenné rady a připomínky a za ochotu po celou dobu vedení mé diplomové práce.

Kolekce, cyklus foreach

Jazyk C# (seminář 6)

Spojová implementace lineárních datových struktur

Semestrální projekt. Předmět: Programování v jazyce C. Zadání: Operace s maticemi. Uživatelský manuál. ver. 1.0

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Základy programování (IZP)

STŘEDOŠKOLSKÁ ODBORNÁ ČINNOST

Geekovo Minimum. Počítačové Grafiky. Nadpis 1 Nadpis 2 Nadpis 3. Božetěchova 2, Brno

Realistické zobrazení terénu

Základy programování (IZP)

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

- transpozice (odlišuje se od překlopení pro komplexní čísla) - překlopení matice pole podle hlavní diagonály, např.: A.' ans =

Pokročilé osvětlovací techniky Josef Pelikán, MFF UK Praha

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Návod k použití softwaru Solar Viewer 3D

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

13 Barvy a úpravy rastrového

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Úvod do programování. Lekce 1

Zobrazování terénů pomocí GPU

Teoretické minimum z PJV

PB071 Programování v jazyce C Jaro 2013

7 Transformace 2D. 7.1 Transformace objektů obecně. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Programování GPU ( shaders )

GPU RAYTRACER PRO OSG

Lineární datové struktury

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Konstruktory a destruktory

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Transkript:

5. října 2015, Brno Připravil: David Procházka Shadery Počítačová grafika 2

Obsah přednášky Strana 2 / 29 Obsah přednášky 1 Obsah přednášky 2 Shadery 3 Shrnutí

Obsah přednášky Strana 3 / 29 Obsah přednášky Dnes se naučíme jak efektivně využívat grafickou kartu pro operace jako je osvětlování, texturování a transformace vrcholů, atp.

Shadery Strana 4 / 29 Obsah přednášky 1 Obsah přednášky 2 Shadery 3 Shrnutí

Shadery Strana 5 / 29 Shadery: základní myšlenka

Shadery Strana 6 / 29 Shadery: HW implementace (příklad ATI)

Shadery Strana 7 / 29 Vertex procesor/shader Vertex procesor spouští vertex shader. (nahrazuje výpočet vestavěnou funkcionalitou) Vstupem jsou data o vrcholu: pozice, barva, normála, atd. Provádí: transformaci pozice vrcholů pomocí modelovací, pohledové a projekční matice transformaci normál, popř. jejich normalizaci transformaci texturovacích souřadnice výpočet osvětlení per vertex výpočet barvy Vertex procesor pracuje s každým vrcholem zvlášt a nemá informace o vzájemném propojení vrcholů. Ve vert. sh. by měla být naplněna proměnná gl Position. Obvykle vynásobením vstupního vrcholu modelovací/pohledovou a transformační maticí.

Shadery Strana 8 / 29 Pixel/Fragment procesor/shader Ve fragment procesoru běží fragment shadery, které provádějí operace jako jsou: výpočet barvy a texturovací souřadnice každého pixelu aplikace textury výpočet mlhy výpočet normály (pro per pixel osvětlení) Vstupují zde interpolované hodnoty z předchozí fáze pozice, barvy, normály, atd. Neví tedy nic o okolních fragmentech, ale má ale také přístup ke stavům OpenGL a zná tedy např. barvu mlhy. Výstupem fragment shaderu byl zápis do proměnné gl FragColor, dnes zápis do obecné výstupní prom.

Shadery Strana 9 / 29 Geometry procesor/shader ˇ ret nove vrcholy (stebla Umoˇznuje vytvaˇ travy, ostny dinosaura). Podpora od Direct3D 10 a OpenGL 3.2. Geometrick y shader je proveden po vertex shaderu.

Shadery Strana 10 / 29 Implementace shaderu

Shadery Strana 11 / 29 Příklad použití shaderu 1 void setshaders () 2 { 3 Gluint p,f,v; 4 char *vs,* fs; 5 // vytvoreni objektu shaderu 6 v = glcreateshader ( GL_ VERTEX_ SHADER ); 7 f = glcreateshader ( GL_ FRAGMENT_ SHADER ); 8 // nacteni shaderu ze souboru 9 vs = textfileread (" toon. vert "); 10 fs = textfileread (" toon. frag "); 11 // pouhe pretypovani 12 const char * vv = vs; 13 const char * ff = fs; 14 // vlozeni kodu shaderu do objektu 15 glshadersource (v, 1, &vv, NULL ); 16 glshadersource (f, 1, &ff, NULL );

Shadery Strana 12 / 29 Příklad použití shaderu 2 1 // uvolneni starych promennych 2 free (vs ); free (fs ); 3 // kompilace shaderu 4 glcompileshader (v); 5 glcompileshader (f); 6 // vytvoreni programu 7 p = glcreateprogram (); 8 // napojeni objektu shaderu 9 glattachshader (p,v); 10 glattachshader (p,f); 11 // slikovani a spusteni 12 gllinkprogram (p); 13 gluseprogram (p); 14 } Existuje spousta pomocných tříd, které to dělají za nás!

Shadery Strana 13 / 29 Jak vypadá shader Jednoduchý C-like program 1 in vec3 a_ Vertex ; 2 in vec3 a_ Color ; 3 out vec4 color ; 4 5 void main ( void ) 6 { 7 gl_ Position = vec4 ( a_ Vertex, 1. 0) 8 color = vec4 ( a_color, 1.0); 9 }

Skaláry float, (u)int, bool. Vektory vec2, vec3, vec4 vektor 2, 3 a 4 floatů, ivec2, ivec3, ivec4 vektor 2, 3 a 4 intů, uvec2, uvec3, uvec4 vektor 2, 3 a 4 un. int. bvec2, bvec3, bvec4 vektor 2, 3 a 4 boolů. Matice mat2, mat3, mat4 čtvercová matice 2x2, 3x3 a 4x4. mat2x2, mat2x3, mat2x4, mat3x2... Datové typy pro textury (jsou i varianty i..., u...) sampler1d pro 1D textury, sampler2d pro 2D textury, sampler3d pro 3D textury, samplercube pro cube map textury, sampler1dshadow pro stínovou mapu, i 2D sampler1darray pro pole tex., i 2D, i shadow. Shadery Strana 14 / 29 Datové typy

Shadery Strana 15 / 29 Přístup ke složkám vektorů Vektory mají standardní komponenty barvy: r, g, b, a souřadnice: x, y, z, w textury: s, t, p, q Lze používat metody pro výběr pole těchto hodnot. Velmi často používáno pro rychlou inicializaci v konstruktorech: vec3 barvybezalfa = vektorbarev.rgb; Mějme vec4 souradnice, lze volat: souradnice.x, souradnice.xyz, souradnice.xz, atp. Nelze: souradnice.xyza (alfa je u barev). Takto lze i přiřazovat: color.rgb = {1.0, 1.0, 0.0}; Konstruktory vektorů jsou mocné: vec4 pruhledna = vec4(odlcolor, 0.5), kde oldcolor je vec3.

Shadery Strana 16 / 29 Kvalifikátor proměnné Kvalifikátor nic const in (attribute) out (varying) uniform centroid in centroid out Význam Lokální proměnná Konstanta Proměnná z předchozího stavu (proměnná z programu předaná do vert. sh.) Proměnná předávaná do následujícího stavu (z vertex shaderu do fragment shaderu) Předaná proměnná, která nemění svůj stav (stejná pro všechny vertexy/fragmenty) Stejné jako in, ale s cen. interpolací Stejné jako out, ale s cen. interpolací

Shadery Strana 17 / 29 Kvalifikátor parametru funkce Kvalifikátor nic/in out inout Význam vstupní parametr výstupní parametr vstupně-výstupní parametr

Shadery Strana 18 / 29 Vestavěné funkce konverze uhlů: radians, degrees, gon. fce: sin, cos, tan, asin, acos, atan, mocniny: pow, exp, log, sqrt, zaokrouhlování: abs, floor, ceil, dělení: mod, porovnání a vzálenosti: min, max, length, distance, operace nad vektory: dot, cross, normalize, aplikace textury: texture.

Shadery Strana 19 / 29 Vertex Shader (GLSL 1.2) Jednoduchý C-like program 1 # version 120 2 attribute vec3 a_ Vertex ; // vstupni hodnoty 3 attribute vec3 a_ Color ; 4 varying vec4 color ; // vystupni hodnota pro FS 5 6 void main ( void ) 7 { 8 gl_ Position = vec4 ( a_ Vertex, 1. 0) 9 color = vec4 ( a_color, 1.0); 10 }

Shadery Strana 20 / 29 Vertex Shader (GLSL 1.3) Jednoduchý C-like program 1 # version 130 2 3 in vec3 a_ Vertex ; 4 in vec3 a_ Color ; 5 out vec4 color ; 6 7 void main ( void ) 8 { 9 gl_ Position = vec4 ( a_ Vertex, 1. 0) 10 color = vec4 ( a_color, 1. 0); 11 }

Shadery Strana 21 / 29 FS přebírající barvu z vertexu (GLSL 1.2) 1 # version 120 2 3 // vstupujici barva z vrcholu 4 varying vec4 color ; 5 6 void main ( void ) { 7 // vystupni promenna pro barvu do GLSL 1.2 8 gl_ FragColor = color ; 9 }

Shadery Strana 22 / 29 FS přebírající barvu z vertexu (GLSL 1.3) 1 # version 130 2 3 in vec4 color ; 4 out vec4 outcolor ; 5 6 void main ( void ) { 7 // gl_ FragColor je obsolete 8 outcolor = color ; 9 }

Shadery Strana 23 / 29 Poskytování dat shaderu Zasílaná data dělíme na data uniformní (platí pro více vrcholů) a data o vrcholech. Poslání uniformních transformačních matic (v metodě vykreslující scénu) 1 // 1 == pocet ukladanych prom. 2 gluniformmatrix4fv ( location, 1, transpose, matrix ); Zaregistrování proměnné pro posílání dat o vrcholech (provedeme po vytvoření shaderu) 1 attribid = 2 glbindattriblocation ( m_ programid, index, attribname ); V knihovnách opět řada pomocných funkcí/metod.

Shadery Strana 24 / 29 Poskytování dat o vrcholech Aktualizace informace o vrcholu void glvertexattribpointer(gluint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer), kde parametry jsou index modifikovaného atributu, počet položek atributu, typ atributu, zda je normalizován, posun mezi vrcholy, ukazatel na počátek. Paralela příkazu glvertexpointer(), resp. glcolorpointer().

Shadery Strana 25 / 29 Poskytování dat o vrcholech Poslání informací o vrcholu (ve vykreslení terénu) 1 // Bind the vertex array 2 glbindbuffer ( GL_ ARRAY_ BUFFER, m_ vertexbuffer ); 3 // Load data into shader 4 glvertexattribpointer ( vertid, 3, GL_FLOAT, 5 GL_ FALSE, 0, vertices ); 6 7 // Bind the color array 8 glbindbuffer ( GL_ ARRAY_ BUFFER, m_ colorbuffer ); 9 // Load data into shader 10 glvertexattribpointer ( colorid, 3, GL_FLOAT, 11 GL_ FALSE, 0, colors );

Shadery Strana 26 / 29 Je třeba aktivovat pole 1 glenablevertexattribarray ( vertid ); // zapni vertex att. 2 glenablevertexattribarray ( colorid ); // zapni color att. 3 4 m_ terrain - > render (); // zde probehne vykresleni 5 6 gldisablevertexattribarray ( vertid ); // vypni vertex att 7 gldisablevertexattribarray ( colorid ); // vypni color att nahrazuje 1 // aktivujeme pole vrcholu a barev 2 glenableclientstate ( GL_ VERTEX_ ARRAY ); 3 glenableclientstate ( GL_ COLOR_ ARRAY ); 4...

Shrnutí Strana 27 / 29 Obsah přednášky 1 Obsah přednášky 2 Shadery 3 Shrnutí

Shrnutí Strana 28 / 29 Upozornění GLSL se velmi rychle mění. Řada přístupů je označena za zastaralá již ve verzi 1.2! (Namátkou gl FragData, gl FragColor)

Shrnutí Strana 29 / 29 Kontrolní otázky Co je to fragment a vertex shader? Jakou strukturu má triviální vertex shader, který pouze aplikuje pohledovou a projekční matici? Jakou strukturu má triviální fragment shader, který udělá komixové barvy objektů? Jak zajistím vstup a výstup hodnot do/ze shaderu?