5. rˇ´ıjna 2015, Brno ´ Pˇripravil: David Prochazka
Shadery ˇ ıtacov ˇ a´ grafika 2 Poc´
ˇ Obsah pˇredna´ sky
ˇ Obsah pˇredna´ sky
1
´ sky Obsah pˇrednaˇ
2
Shadery
3
Shrnut´ı
Strana 2 / 29
ˇ Obsah pˇredna´ sky
Strana 3 / 29
ˇ Obsah pˇredna´ sky Dnes se nauˇc´ıme jak efektivneˇ vyuˇz´ıvat grafickou kartu pro ˇ ´ ı, texturovan´ ´ ı a transformace operace jako je osvetlov an´ vrcholu, ˚ atp.
Shadery
ˇ Obsah pˇredna´ sky
1
´ sky Obsah pˇrednaˇ
2
Shadery
3
Shrnut´ı
Strana 4 / 29
Shadery
´ ˇ Shadery: zakladn´ ı myslenka
Strana 5 / 29
Shadery
Shadery: HW implementace (pˇr´ıklad ATI)
Strana 6 / 29
Shadery
Strana 7 / 29
Vertex procesor/shader Vertex procesor spouˇst´ı vertex shader. (nahrazuje v´ypoˇcet ˇ vestavenou funkcionalitou) ´ atd. Vstupem jsou data o vrcholu: pozice, barva, normala, ´ ı: Provad´ transformaci pozice vrcholu˚ pomoc´ı modelovac´ı, pohledove´ a projekˇcn´ı matice ´ popˇr. jejich normalizaci transformaci normal, transformaci texturovac´ıch souˇradnice ˇ v´ypoˇcet osvetlen´ ı per vertex v´ypoˇcet barvy
´ st’ a nema´ Vertex procesor pracuje s kaˇzd´ym vrcholem zvlaˇ ´ ´ propojen´ı vrcholu. informace o vzajemn em ˚ ˇ b´yt naplnena ˇ ˇ a´ gl Position. Ve vert. sh. by mela promenn ´ Obvykle vynasoben´ ım vstupn´ıho vrcholu modelovac´ı/pohledovou a transformaˇcn´ı matic´ı.
Shadery
Strana 8 / 29
Pixel/Fragment procesor/shader ˇ z´ı fragment shadery, ktere´ Ve fragment procesoru beˇ ´ ej´ ˇ ı operace jako jsou: provad ´ v´ypoˇcet barvy a texturovac´ı souˇradnice kaˇzdeho pixelu aplikace textury v´ypoˇcet mlhy ´ (pro per pixel osvetlen´ ˇ v´ypoˇcet normaly ı)
´ – Vstupuj´ı zde interpolovane´ hodnoty z pˇredchoz´ı faze ´ atd. pozice, barvy, normaly, Nev´ı tedy nic o okoln´ıch fragmentech, ale ma´ ale take´ pˇr´ıstup ke stavum ˚ OpenGL a zna´ tedy napˇr. barvu mlhy. ´ ˇ e´ V´ystupem fragment shaderu byl zapis do promenn ´ gl FragColor, dnes zapis do obecne´ v´ystupn´ı 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
Implementace shaderu
Strana 10 / 29
Shadery
Pˇr´ıklad pouˇzit´ı shaderu 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
void setShaders () { Gluint p ,f , v ; char * vs ,* fs ; // vytvoreni objektu shaderu v = glCreateShader ( GL_VERTEX_SHADER ); f = glCreateShader ( G L_F RA GM EN T_ SH AD ER ); // nacteni shaderu ze souboru vs = textFileRead ( " toon . vert " ); fs = textFileRead ( " toon . frag " ); // pouhe pretypovani const char * vv = vs ; const char * ff = fs ; // vlozeni kodu shaderu do objektu glShaderSource (v , 1 , & vv , NULL ); glShaderSource (f , 1 , & ff , NULL );
Strana 11 / 29
Shadery
Strana 12 / 29
Pˇr´ıklad pouˇzit´ı shaderu 2 // uvolneni starych promennych free ( vs ); free ( fs ); // kompilace shaderu glCompileShader ( v ); glCompileShader ( f ); // vytvoreni programu p = glCreateProgram (); // napojeni objektu shaderu glAttachShader (p , v ); glAttachShader (p , f ); // slikovani a spusteni glLinkProgram ( p ); glUseProgram ( p );
1 2 3 4 5 6 7 8 9 10 11 12 13 14
}
ˇ ı za nas! ´ Existuje spousta pomocn´ych tˇr´ıd, ktere´ to delaj´
Shadery
Jak vypada´ shader Jednoduch´y C-like program 1 2 3
in vec3 a_Vertex ; in vec3 a_Color ; out vec4 color ;
4 5 6 7 8 9
void main ( void ) { gl_Position = vec4 ( a_Vertex , 1.0) color = vec4 ( a_Color , 1.0); }
Strana 13 / 29
Shadery
Strana 14 / 29
Datove´ typy ´ Skalary float, (u)int, bool.
Vektory vec2, vec3, vec4 – vektor 2, 3 a 4 floatu, ˚ ivec2, ivec3, ivec4 – vektor 2, 3 a 4 intu, ˚ uvec2, uvec3, uvec4 – vektor 2, 3 a 4 un. int. bvec2, bvec3, bvec4 – vektor 2, 3 a 4 boolu. ˚
Matice mat2, mat3, mat4 – cˇ tvercova´ matice 2x2, 3x3 a 4x4. mat2x2, mat2x3, mat2x4, mat3x2 . . .
Datove´ 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 15 / 29
´ vektoru˚ Pˇr´ıstup ke sloˇzkam Vektory maj´ı standardn´ı komponenty barvy: r, g, b, a souˇradnice: x, y, z, w textury: s, t, p, q
ˇ pole techto ˇ Lze pouˇz´ıvat metody pro v´yber hodnot. Velmi ´ cˇ asto pouˇz´ıvano pro rychlou inicializaci v konstruktorech: vec3 barvyBezAlfa = vektorBarev.rgb; ˇ Mejme vec4 souradnice, lze volat: souradnice.x, souradnice.xyz, souradnice.xz, atp. Nelze: souradnice.xyza (alfa je u barev).
Takto lze i pˇriˇrazovat: color.rgb = {1.0, 1.0, 0.0};
´ Konstruktory vektoru˚ jsou mocne: vec4 pruhledna = vec4(odlColor, 0.5), kde oldColor je vec3.
Shadery
Strana 16 / 29
´ ˇ e´ Kvalifikator promenn ´ Kvalifikator nic const in (attribute) out (varying) uniform centroid in centroid out
Vyznam ´ ´ ı promenn ˇ a´ Lokaln´ Konstanta ˇ a´ z pˇredchoz´ıho stavu Promenn ˇ a´ z programu pˇredana´ do vert. sh.) (promenn ˇ a´ pˇredavan ´ ´ Promenn a´ do nasleduj´ ıc´ıho stavu (z vertex shaderu do fragment shaderu) ˇ a, ´ ktera´ nemen´ ˇ ı svuj Pˇredana´ promenn ˚ stav (stejna´ pro vˇsechny vertexy/fragmenty) Stejne´ jako in, ale s cen. interpolac´ı Stejne´ jako out, ale s cen. interpolac´ı
Shadery
Strana 17 / 29
´ Kvalifikator parametru funkce ´ Kvalifikator nic/in out inout
Vyznam ´ vstupn´ı parametr v´ystupn´ı parametr ˇ ystupn´ı parametr vstupne-v´
Shadery
Strana 18 / 29
ˇ e´ funkce Vestaven konverze uhlu: ˚ radians, degrees, gon. fce: sin, cos, tan, asin, acos, atan, mocniny: pow, exp, log, sqrt, ´ ı: abs, floor, ceil, zaokrouhlovan´ ˇ ı: mod, delen´ ´ ı a vzalenosti: ´ porovnan´ min, max, length, distance, operace nad vektory: dot, cross, normalize, aplikace textury: texture.
Shadery
Strana 19 / 29
Vertex Shader (GLSL 1.2) Jednoduch´y C-like program 1 2 3 4
# version 120 attribute vec3 a_Vertex ; // vstupni hodnoty attribute vec3 a_Color ; varying vec4 color ; // vystupni hodnota pro FS
5 6 7 8 9 10
void main ( void ) { gl_Position = vec4 ( a_Vertex , 1.0) color = vec4 ( a_Color , 1.0); }
Shadery
Vertex Shader (GLSL 1.3) Jednoduch´y C-like program 1
# version 130
2 3 4 5
in vec3 a_Vertex ; in vec3 a_Color ; out vec4 color ;
6 7 8 9 10 11
void main ( void ) { gl_Position = vec4 ( a_Vertex , 1.0) color = vec4 ( a_Color , 1.0); }
Strana 20 / 29
Shadery
Strana 21 / 29
FS pˇreb´ıraj´ıc´ı barvu z vertexu (GLSL 1.2) 1
# version 120
2 3 4
// vstupujici barva z vrcholu varying vec4 color ;
5 6 7 8 9
void main ( void ) { // vystupni promenna pro barvu do GLSL 1.2 gl_FragColor = color ; }
Shadery
Strana 22 / 29
FS pˇreb´ıraj´ıc´ı barvu z vertexu (GLSL 1.3) 1
# version 130
2 3 4
in vec4 color ; out vec4 outColor ;
5 6 7 8 9
void main ( void ) { // gl_FragColor je obsolete outColor = color ; }
Shadery
Strana 23 / 29
´ ı dat shaderu Poskytovan´ ˇ ıme na data uniformn´ı (plat´ı pro v´ıce vrcholu) Zas´ılana´ data del´ ˚ a data o vrcholech. ´ ı uniformn´ıch transformaˇcn´ıch matic (v metodeˇ Poslan´ ´ vykresluj´ıc´ı scenu) 1 2
// 1 == pocet ukladanych prom . glUnif or mM at ri x4 fv ( location , 1 , transpose , matrix );
´ ı promenn ˇ e´ pro pos´ılan´ ´ ı dat o vrcholech Zaregistrovan´ (provedeme po vytvoˇren´ı shaderu) 1 2
attribId = glBin d A t t r i b L o c a t i o n ( m_programID , index , attribName );
´ opet ˇ ˇrada pomocn´ych funkc´ı/metod. V knihovnach
Shadery
Strana 24 / 29
´ ı dat o vrcholech Poskytovan´ Aktualizace informace o vrcholu void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer), kde parametry jsou index ´ modifikovaneho atributu, poˇcet poloˇzek atributu, typ atributu, ´ posun mezi vrcholy, ukazatel na poˇcatek. ´ zda je normalizovan, Paralela pˇr´ıkazu glVertexPointer(), resp. glColorPointer().
Shadery
Strana 25 / 29
´ ı dat o vrcholech Poskytovan´ ´ ı informac´ı o vrcholu (ve vykreslen´ı terenu) ´ Poslan´ 1 2 3 4 5
// Bind the vertex array glBindBuffer ( GL_ARRAY_BUFFER , m_vertexBuffer ); // Load data into shader glV ert e x A t t r i b P o i n t e r ( vertId , 3 , GL_FLOAT , GL_FALSE , 0 , vertices );
6 7 8 9 10 11
// Bind the color array glBindBuffer ( GL_ARRAY_BUFFER , m_colorBuffer ); // Load data into shader glV ert e x A t t r i b P o i n t e r ( colorId , 3 , GL_FLOAT , GL_FALSE , 0 , colors );
Shadery
Strana 26 / 29
Je tˇreba aktivovat pole 1 2
g l E n a b l e V e r t e x A t t r i b A r r a y ( vertId ); // zapni vertex att . g l E n a b l e V e r t e x A t t r i b A r r a y ( colorId ); // zapni color att .
3 4
m_terrain - > render (); // zde probehne vykresleni
5 6 7
g l D i s a b l e V e r t e x A t t r i b A r r a y ( vertId ); // vypni vertex att g l D i s a b l e V e r t e x A t t r i b A r r a y ( colorId ); // vypni color att
nahrazuje 1 2 3 4
// aktivujeme pole vrcholu a barev glEnab le C l ie n t Sta t e ( GL_VERTEX_ARRAY ); glEnab le C l ie n t Sta t e ( GL_COLOR_ARRAY ); ...
Shrnut´ı
ˇ Obsah pˇredna´ sky
1
´ sky Obsah pˇrednaˇ
2
Shadery
3
Shrnut´ı
Strana 27 / 29
Shrnut´ı
Strana 28 / 29
ˇ ı Upozornen´ ˇ ˇ ı. Rada GLSL se velmi rychle men´ pˇr´ıstupu˚ je oznaˇcena za ´ zastarala´ jiˇz ve verzi 1.2! (Namatkou gl FragData, gl FragColor)
Shrnut´ı
Strana 29 / 29
´ Kontroln´ı otazky Co je to fragment a vertex shader? ´ ı vertex shader, kter´y pouze Jakou strukturu ma´ trivialn´ aplikuje pohledovou a projekˇcn´ı matici? ´ ı fragment shader, kter´y udel ˇ a´ Jakou strukturu ma´ trivialn´ komixove´ barvy objektu? ˚ Jak zajist´ım vstup a v´ystup hodnot do/ze shaderu?