ČČást 20 : OpenGL Shading Language - Vývoj CPU a GPU: GPU CPU Vertex processing Rasterization Fragment tests API+driver Primitive assembly Fragment processing Blending 1 2 3 4 5 6 7 Application image T tTexture memory Input fragment streem Output fragment streem Fragment program Input fragment streem Output fragment streem Constant registers Working registersInput i Output iregisters registers I kč í dInstrukční sada * Obecné instrukce : MOV, ... * Aritmetické instrukce : ADD, SUB, ... * Matematické instrukce : SINˇ Matematické instrukce : SIN, ... * Řídící instrukce: KIL, ... * Spec. grafické instr. : DST, ... T t í i t k TEXˇ Texturovací instrukce: TEX, ... V t Per-vertex operations and Vertex data Frameb Di l li t Evaluators primitive assembly R t i ti Per-fragment Pixel buffer Display list Pixel i Rasterization Texture operations data operations Texture assembly Vertex Per-vertex operations Fixed functionality vertex processing Fixed functionality fragment processing Vertex data Frameb Rasterization Per-fragment operations Primitive assembly Fragment processing Pixel d buffer Pixel operations Texture data operations memory Vertex Processor - Transformace vrcholů - Transformace normál a normalizace - Generování texturových souřadnic - Transformace texturových souřadnicTransformace texturových souřadnic - Osvětlení Nastavení barev materiálu- Nastavení barev materiálu -Vertex shaders mohou být použity ke specifikaci zcela obecných sekvencí operací, které se aplikují na každý vrchol a s ním asociovaná dataa s ním asociovaná data. - Vertex shaders které provádí některé z výpočtů uvedených v předchozím seznamu musí provést všechny požadovanév předchozím seznamu, musí provést všechny požadované funkce z tohoto seznamu.. Fragment Processor - Operace na interpolovaných hodnotách - Přístup k texturámp - Aplikace textur - FogFog - Součty barev - Fragment shaders jsou použity pro algoritmy prováděné na fragmentových procesorech které produkují výstupnífragmentových procesorech, které produkují výstupní hodnoty založené na poskytovaných vstupních hodnotách. Fragment shader nemůže měnit x/y pozici fragmentu- Fragment shader nemůže měnit x/y pozici fragmentu. - Fragment shaders, které provádí některé z výpočtů uvedených v předchozím seznamu musí provést všechnyuvedených v předchozím seznamu, musí provést všechny požadované funkce z tohoto seznamu. Fragment Processor - Primárním vstupem fragmentového shaderu jsoup g j interpolované varying proměnné, které jsou výsledkem rasterizace. - Fragmentový procesor nenahradí grafické operace, které požadují informace o několika fragmentech v jedné chvíli. - Z důvodu podpory paralelizmu na úrovni zpracování fragmentu jsou fragmentové shadery psány způsobem který vyjadřuje požadovaný výpočet pro jeden fragment a přístup k sousedním fragmentům není povolen. Built-in uniform variables gl Fog User-defined uniform variables EyePos Built-in uniform variables gl Fog User-defined uniform variables EyePosgl_Fog gl_ModelViewMatrix etc. y Epsilon etc. gl_Fog gl_ModelViewMatrix etc. y Epsilon etc. Built-in varying variables gl_FrontColor etc Special input Vertex processor Fragment processor etc. User-defined varying variables Density Texture maps p p variables gl_FragCoord gl_FrontFacing Built-in U d fi d Density etc. attribute variables gl_Color gl Vertex User-defined attribute variables Velocity T t Special output variables gl position Special output variables gl FragColorg _ gl_Normal etc. Tangent etc. gl_position gl_PointSize gl_ClipVertex etc. gl_FragColor gl_FragDepth První příklad // Vertex shader uniform float CoolestTemp; uniform float TempRange; attribute float VertexTemp; varying float Temperature; void main() { Temperature= (VertexTemp ­ CoolestTemp)/TempRange; gl_Position= gl_ModelViewProjectionMatrix * gl_Vertex; } --------------------------- // Fragment shader uniform vec3 CoolestColor; uniform vec3 HottestColor; varying float Temperature; void main() { vec3 color= mix(CoolestColor, HottestColor, Temperature); gl_FragColor= vec4(color, 1.0); } Definice jazyka - OpenGL Shading language je založen na systému programovacího jazyka ANSI C. Doplňky k C - vektorové typy jsou podporovány pro hodnoty float, int a bool - vec{2,3,4}, ivec{2,3,4}, bvec{2,3,4}, vec4 v=vec4(1.0, 0.5, 0.0, 1.0); vec4 u=vec4(5 0 3 0 2 0 4 0);vec4 u=vec4(5.0, 3.0, 2.0, 4.0); vec4 w; vec2 w2; float a,b; w= v+u; a= v.x; b= v.z; w2= u.zw; (swizzling) // x,y,z,w ­ Treats a vector as a position or direction // r,g,b,a ­ Treats a vector as a color // s,t,p,q ­ Treats a texture coordinate Definice jazyka - Matice mat2, mat3, mat4 -matice 2x2, 3x3, 4x4 K matici můžete přistupovat jako k vektoru po sloupcích. vec4 u; mat4 m;mat4 m; m= ... u= m[3]; - Samplers sampler{1 2 3}Dsampler{1,2,3}D samplerCube textura mapovaná na kostku. l {1 2}D h dsampler{1,2}Dshadow hloubková textura s porovnáním. Definice jazyka Shadery nemohou samy inicializovat samplery. Mohou je pouze obdržet od aplikace přes kvalifikátor, nebo je předat k dalšímu zpracování vestavěné funkci. Sampler nemůže být modifikován. Uniform sampler2D Grass; // texture2D use the texture coordinate vec2 coord to do a texture // lookup in the 2D texture currently specified by sampler// lookup in the 2D texture currently specified by sampler vec4 color= texture2D(Grass, coord); Kvalifikátory- Kvalifikátory attribute Pro často měněné informace (jednou za vrchol) uniform Pro zřídka měněné informace (polygony)u o o d a ě ě é o ace (po ygo y) varying Pro interpolované informace const Deklaruje neměnnoé, časově konstantní proměnné Definice jazyka - Inicializátory a konstruktoryy y - Proměnná shaderu může být inicializována v okamžiku deklarace. - Attribute, uniform a varying nemohou být inicializovány v okamžiku, y g ý y deklarace. - Existují konstruktory pro všechny vestavěné typy (s výjimkou samplerů) a pro str kt rsamplerů) a pro struktury. vec4 v=vec4(1.0, 0.5, 0.0, 1.0);vec4 v vec4(1.0, 0.5, 0.0, 1.0); --- vec4 v; v= vec4(1.0, 0.5, 0.0, 1.0);v vec4(1.0, 0.5, 0.0, 1.0); mat2 m=(1.0, 2.0, 3.0, 4.0); --- Definice jazyka vec3 color= vec3(0.2, 0.5, 0.6); struct light { vec4 position; struct lightColor { vec3 color; float intensity; } }light1 = light(v, lightColor(color, 0.9)); - Typová konverze E li it í t á k t ktéž ádí í k t kt ůExplicitní typová konverze se taktéž provádí pomocí konstruktorů. OpenGL Shading language neposkytuje syntaxi jazyka pro převod typů. Namísto toho jsou pro konverzi použity konstruktory.j p p y y float f= 2.3; bool b= bool(f); float f= float(3); // convert integer 3 to 3 0float f= float(3); // convert integer 3 to 3.0 float g= float(b); // convert Boolean b to floating point vec4 v= vec4(2) // all components of v are set to 2.0 Definice jazyka Flow Control for, while, do-while, break, continue if if-elseif, if-else :? goto, switch ­ není povolenog , p discard ­ zabrání fragmentu provést update frame-bufferu. V okamžiku ů h d ř t t klíč é l á ý f t číprůchodu přes toto klíčové slovo se zpracovávaný fragment označí jakožto skartovaný. Swizzling vec4 v4; v4.rgba; v4 rgb;v4.rgb; v4.b; v4.xy; v4.xgba; //!! Illegal ­ the component names do not come from the same set. Definice jazyka Operace po komponentách S ěk lik ál ýji k i kd át lik j kt- S několika málo výjimkami, kdy se operátor aplikuje na vektor, se operátor chová, jako by byl aplikován na každou komponentu vektoru zvlášť. vec3 u,v, w; float f; v= u+f; ~ v.x= u.x+f; v.y= u.y+f; v.y= u.y+f; w= u+v; ~ w.x= u.x+v.x; u.y+v.y; u.z+v.z; - Logické operátory !, &&, ||, ^^ fungují pouze na výrazech, které jsou označeny jakožto scalar Booleans, a jejich výsledkem je scalar Boolean - Relační operátory (<, >, <=, >=) fungují pouze na floating-point a integer skalárech a výsledkem je scalar Boolean. - Operátory rovnosti (==, !=) fungují na všech typech s výjimkou polí. Výsledkem je scalar Boolean. Vestavěné funkce ­ Trigonometrické funkce float radians(float degrees) {1 2 3} di ( {1 2 3} d )vec{1,2,3} radians(vec{1,2,3} degrees) Konvertuje stupně na radiány a vrátí výsledek float degrees(float radians) vec{1,2,3} degrees(vec{1,2,3} radians) Konvertuje radiány na stupně a vrátí výsledek float sin(float radians)float sin(float radians) vec{1,2,3} sin(vec{1,2,3} radians) Standardní trigonometrická funkce sinus cos, tan, asin, acos, atan Vestavěné funkce float pow(float x, float y) {1 2 3} ( {1 2 3} {1 2 3} )vec{1,2,3} pow(vec{1,2,3} x, vec{1,2,3} y) Vrátí x umocněno na y float exp2(float x) vec{1,2,3} exp2(vec{1,2,3} x) vrátí 2 umocněno na x log2 sqrt inversesqrtlog2, sqrt, inversesqrt Vestavěné funkce float abs(float x, float y) {1 2 3 4} b ( {1 2 3 4})vec{1,2,3,4} abs(vec{1,2,3,4}) Vrátí x jestliže x>=0; jinak vrátí -x sign ... flfloor Vrátí hodnotu rovnou nejbližšímu celému číslu které je menší než nebo rovno x ceil Vrátí hodnotu rovnou nejbližšímu celému číslu které je větší nežceil Vrátí hodnotu rovnou nejbližšímu celému číslu které je větší než nebo rovno x fract Vrátí x- floor(x)( ) Vestavěné funkce float mod(float x, float y) {1 2 3} d( {1 2 3} [ {1 2 3} fl t] )vec{1,2,3} mod(vec{1,2,3} x, [vec{1,2,3}, float] y) Vrátí x-y*floor(x/y) pro každou komponentu z x za použití hodnoty (odpovídající komponenty) y(odpovídající komponenty) y. min, max... float clamp(float x, float minVal, float maxVal) vec{1 2 3} clamp(vec{1 2 3} x float minVal float maxVal)vec{1,2,3} clamp(vec{1,2,3} x, float minVal, float maxVal) Vrátí min(max (x, minVal), maxVal) float mix(float x, float minVal, float maxVal) vec{1,2,3} mix(vec{1,2,3} x, vec{1,2,3} y, [float, vec{1,2,3}] a) Vrátí x*(1.0-a)+y*a Vestavěné funkce float step(float edge, float x) {1 2 3} t ( {1 2 3} {1 2 3} )vec{1,2,3} step(vec{1,2,3} x, vec{1,2,3} y) Vrátí 0 jestliže x <= edge; jinak vrátí 1.0. float smoothstep(float edge0, float edge1, float x) vec{1,2,3} smoothstep(vec{1,2,3} edge0, vec{1,2,3} edge1, float x) Vrátí 0 jestliže x <= edge0 a 1.0 jestliže x >= edge1 a provede hl dk H it k i t l i i 0 1 0 kd edge0 < x y. bvec{2,3,4} greatherThenEqual([i]vec{2,3,4} x, [i]vec{2,3,4} x)) Vrátí srovnání po komponentách x>=y. b {2 3 4} E l([i b] {2 3 4} [i b] {2 3 4} )bvec{2,3,4} Equal([i,b]vec{2,3,4} x, [i,b]vec{2,3,4} x) Vrátí srovnání po komponentách x==y. Vestavěné funkce bvec{2,3,4} notEqual([i,b]vec{2,3,4} x, [i,b]vec{2,3,4} x){ , , } q ([ , ] { , , } , [ , ] { , , } ) Vrátí srovnání po komponentách x!=y. b l (b {2 3 4} )bool any(bvec{2,3,4} x) Vrátí true jestliže nějaká komponenta x je true. bool all(bvec{2,3,4} x) Vrátí true pouze pokud každá komponenta x je true.j bool not(bvec{2,3,4} x) Vrátí logický komplement vektoru x po složkách. Vestavěné funkce ­ Funkce pro přístup k texturám ě é f ff " "- Vestavěné funkce se suffixem "Lod" jsou povoleny pouze ve vertex shaderu. Pro funkce "Lod", lod je přímo použito jako level of detail. - Vestavěné funkce se suffixem"Proj" mohou být použity pro projektivní texturování. Umožňují textuře projektovat se na objekt obdobně jako jsou promítány slajdy. Může být použito k výpočtu stínových map. vec4 texture1D(sampler1D sampler, float coord [,float bias]) vec4 texture1DProj(sampler1D sampler, vec2 coord [,float bias]) vec4 texture1DProj(sampler1D sampler vec4 coord [ float bias])vec4 texture1DProj(sampler1D sampler, vec4 coord [,float bias]) vec4 texture1DLod(sampler1D sampler, float coord [,float bias]) vec4 texture1DProjLod(sampler1D sampler, vec2 coord [,float bias]) 4 t t 1DP jL d( l 1D l 4 d [ fl t bi ])vec4 texture1DProjLod(sampler1D sampler, vec4 coord [,float bias]) - Texturové souřadnice coord se používají k vyzvednutí informací z 1D textury aktuálně specifikované samplerem. Pro projektivní (Proj) verze, texturová souřadnice coord.s je dělena poslední komponentou coord. Druhá a třetí komponenta coord je pro variantu vec4 coord ignorována.p j p g Vestavěné funkce - Obdobně texture2D - Další položky: texture3D, textureCube, shadow1D, shadow2D. Funkce zpracovávající fragmentyFunkce zpracovávající fragmenty - Pouze na fragment processoru F k d i í dFd dFd j žit k č í hl ti ě- Funkce derivací, dFdx a dFdy jsou použity k určení rychlosti změn výrazu. float dFdx(float rho), ... Vrátí derivaci v x pro vstupní argument rho. float dFdy(float rho), ... Vrátí derivaci v y pro vstupní argument rho. Šumové funkce ... Důležité vestavěné proměnné Vertex Attributes attribute vec4 gl_Color; attribute vec4 gl_SecondaryColor; attribute vec4 gl_Normal; attribute vec4 gl MultiTexCoord0;g _ ; attribute vec4 gl_MultiTexCoord1; attribute vec4 gl_MultiTexCoord2; //... up to gl_MultiTexCoordN-1, where N = gl_MxTextureCoords attribute float gl FogCoord;g _ g ; Uniform Variables Shadery mohou přistupovat k aktuálnímu stavu OpenGL přes vestavěné proměnné obsahující rezervovaný prefix "gl_" l M d lVi M t igl_ModelViewMatrix ... Důležité vestavěné proměnné Speciální výstupní proměnné vec4 gl_position; // must be written to Proměnná gl_position je určena pro zápis pozice vrcholu v clipping coordinates, poté co byly vypočteny ve vertex shaderu. float gl_PointSize; // may be written to vec4 gl_ClipVertex; // may be written to Varying Variables varying vec4 gl_FrontColor; i 4 l kC lvarying vec4 gl_BackColor; varying vec4 gl_FrontSecondaryColor; varying vec4 gl_BackSecondaryColor; varying vec4 gl_TexCoord[gl_MaxTExtureCoords]; i fl t l F F C dvarying float gl_FogFragCoord;