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?