Post on 23-Jan-2016
description
gabriel.fournier@liris.cnrs.fr - http://liris.cnrs.fr/~fournier
Laboratoire d'InfoRmatique en Image et Systèmes d'informationhttp://liris.cnrs.fr
FRE 2672
Gabriel Fournier - 19/01/2006
Programmation des GPU avec GLSL
Gabriel Fournier
19/01/2006 Gabriel Fournier 2
Plan
Le pipeline graphique Les types de shader Interaction application – shader Le langage GLSL Le rendu multi passe GPGPU
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 3
OpenGL 1.0
API graphique entre le matériel et l’applicationGère
Caméra virtuelle (pyramide de vision, projection)Rastérisation, points, lignes, polygonesÉlimination des parties cachéesApplication de textures ‘Éclairement’, BRDF de Phong
Ne gère pasCalculs d’ombresRéflexionsÉclairement globalLa physique des scènes (collisions, mouvements…)
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 4
Pipeline classique
CPU Création du contexte (depth_buffer, double_buffer,color_depth…)
Initialisation (projection, pyramide de vision, sources…)
Paramétrage des primitives (modelview, textures,…)
Dessin des primitives (glBegin( ) )
Description des sommets (glColor( ),…, glVertex( ))
Pipeline du GPU: Traitement des vertex (sommets)
Transform & Lighting Assemblage des primitives
Sommets triangles Projection en 2D Rasterisation Traitement des fragments (~pixels)
Textures, couleurs, fog Opérations sur les fragments
Stencil, depth, blending
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 5
Pourquoi des GPU programmables ?
Pipeline classique figé et limité : Rendu : Éclairement calculé aux sommets Textures : bitmaps Projection : perspective ou parallèle.
Ça se joue au niveau du traitement des vertex et des fragments
Pipeline programmable : BRDF plus sophistiquées Textures procédurales matériaux plus réalistes Rendu non photo-réaliste Animation procédurale Traitement d’image Anti Alissage …
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 6
Exemples : images tirées de GLSL Overview, 3DLabs
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 7
Pipeline programmable
Pipeline du GPU programmableVertex Shader : Traitement des vertex (sommets)
Transform & LightingAssemblage des primitives
Sommets trianglesProjection en 2DRasterisationFragment Shader : Traitement des fragments (~pixels)
Textures, couleurs, fogOpérations sur les fragments
Stencil, depth, blending
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 8
Pipeline programmable
Exécution parallèlePlusieurs vertex (ou fragment) sont traités
simultanément par un même programme : SIMD
Flux de données dans un seul sensPas de variable globale en écriturePas de sortie en lecture/écriture
Traitement conditionnel (if) souvent coûteux.
Pas d’accès aux sommets voisinsPas d’accès aux pixels voisins
Pour certains effets : multi-passe
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 9
Langages
Plusieurs langagesCg : (Nvidia) 2002
Langage de haut niveau Indépendant de la plateforme DirectX, OpenGLCompilateur externe
HLSL : (Microsoft) 2003Langage de haut niveauUniquement pour DirectX
GLSL : (3DLabs, OpenGL) 2004Langage de haut niveauUniquement pour OpenGLCompilateur interne intégré à OpenGL
Assembleur :Bas niveau, faible lisibilité
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 10
Vertex Shader
Opérations traditionnelles Transformation spatiale des sommets et des normales Calcul des coordonnées dans la texture Éclairement
Entrées Attribute variables : associées à chaque sommet
Traditionnelles: gl_Color, gl_Normal, gl_Vertex, gl_MultiTexCoord0,…
Définies par l’utilisateur Uniform variables : associées au programme
Traditionnelles : gl_ModelViewMatrix, gl_FrontMaterial, gl_LightSource0, …
Définies par l’utilisateur Textures
Sorties Spéciales : gl_position, gl_PointSize, gl_ClipVertex
Varying variables :
entrée du fragment shader, interpolées entre les sommets Traditionnelles : gl_FrontColor, gl_BackColor, gl_FogFragCoord,…
Définies par l’utilisateur
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 11
Fragment Shader
Opérations traditionnellesOpérations sur les valeurs interpoléesApplication des texturesCalcul de la couleur du pixel
Entrées :Varying variables : interpolées entre les sommets
Traditionnelles : gl_color, gl_SecondaryColor, gl_TexCoord0,…
Définies par l’utilisateurSpéciales : gl_FragCoord, gl_FrontFacingUniform variables : associées au programme
Les mêmes que pour le vertex shaderTextures
Sorties :gl_FragColor, gl_FragDepth
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 12
Interactions:
Vertex Attribute variables
Program Uniform variable
Textures
Vertex Shader
Varying variables
Fragment Shader
Color, Depth
Rasterisation
Depth, Stencil Tests
Textures
Program Uniform variable
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 13
Exemple//Vertex Shaderuniform float temp_min;uniform float temp_max;
attribute float vertex_temp;
varying float temperature;
void main(){
temperature = (vertex_temp-temp_min)/(temp_max-temp_min);gl_position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
//Fragment Shaderuniform vec3 col_froid;uniform vec3 col_chaud;
varying float temperature;
void main(){
vec3 color = mix(col_froid,col_chaud,temperature);gl_FragColor = vec4(color,1.0);
}
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 14
OpenGL API : Shader and Program
ShaderObject Équivalent à un .o en C Un même Shader peut être découpé en modules dans plusieurs
ShaderObject Création
GLhandleARB glCreateShaderObjectARB(GLenum shaderType) Chargement
void glShaderSourceARB(GLhandleARB shader, GLuint nstrings, const GLcharARB **strings,
GLint *lengths) Compilation
void glCompileShaderARB(GLhandleARB shader)
Program Équivalent à l’exécutable Création
GLhandleARB glCreateProgramObjectARB(void) Rattachement
void glAttachObjectARB(GLhandleARB program, GLhandleARB shader) Linkage
void glLinkProgramARB(GLhandleARB program) Insertion dans le pipeline
void glUseProgramObjectARB(GLhandleARB program)
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 15
GLSL : qualifiers
Variables qualifiées de Attribute :
Changent typiquement pour chaque sommet Uniquement dans Vertex Shader Read Only Seulement float, vecX et matX (pas d’int ni de bool)
Uniform : Changent au plus à chaque primitive Communes au Vertex et Fragment Shader Read Only
Varying : Communication entre Vertex et Fragment Shader Read, Write dans Vertex Shader Read Only dans Fragment Shader
Const : Constantes locale à un Shader Read Only
Sans qualifieur: Variables locales à un Shader (une seule exécution) Read, Write
PAS de variables static !
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 16
GLSL : types
Types: Scalaires : float, int, bool
Entiers pas forcément représentés matériellement Au moins 16 bits, pas de << & …
Vecteurs : Float : vec2, vec3, vec4 Int : ivec2, ivec3, ivec4 Bool : bvec2, bvec3,bvec4 Accès avec (équivalents, juste pour la lisibilité)
.x, .y, .z, .w ou .r, .g, .b, .a ou .s, .t, .p, .q
Matrices de float : mat2, mat3, mat4 Mat4 m; vec4 v=m[0]; float f=m[0][0];
Samplers : Accès aux textures. Toujours qualifiés uniform sampler1D, sampler2D, sampler3D, samplerCube, sampler1DShadow,
sampler2DShadow
Structures : comme en C, pas besoin de typedef Tableaux : taille pas forcement précisée à la déclaration mais connue à la
compilation Pas de promotion de type :
float a=3;//FAUX float a=3.0; Conversions : float a=float(3); vec4 b=vec4(3);//tous à 3
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 17
OpenGL API : interaction avec le shader
Spécification des attributs des sommets glColorXX(…) gl_color , …. glVertexAttribXXARB(GLuint index, …) attribut générique Pour envoyer le sommet, on finit par :
glVertexXX(…) ou glVertexAttribXXARB(0, …)
Lien entre attributs génériques et variables attributs du Shader glBindAttribLocationARB(GLhandleARB program, GLuint index,
const GLcharARB *name) glBindAttribLocation(shader_id,1, ’’couleur ’’);
GLint glGetAttribLocationARB(GLhandleARB prog, const GLcharARB *name)
Disponible après le linkage , -1 si erreur
On peut utiliser les vertex arrays void glVertexAttribPointerARB(GLuint index, GLint size,
GLenum type, GLboolean normalized,
GLsizei stride, const GLvoid *pointer)
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 18
OpenGL API : Interaction avec le Shader
Spécifications des variables uniformes GLint glGetUniformLocationARB(GLhandleARB program,
const GLcharARB *name) Après le linkage, -1 si erreur
glUniformXXARB(GLuint location, … ) glUniformMatrix (GLuint location, GLint location,
GLuint count, GLboolean transpose, const GLfloat *v );
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 19
Au travail !Créer un ShaderProgram contenant les programmes suivants.Dessiner un triangle en passant une température différente à chacun de ses
sommets
//Vertex Shader : temp_vs.txtuniform float temp_min;uniform float temp_max;
attribute float vertex_temp;
varying float temperature;
void main(){
temperature = (vertex_temp-temp_min)/(temp_max-temp_min);gl_position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
//Fragment Shader : temp_fs.txtuniform vec3 col_froid;uniform vec3 col_chaud;
varying float temperature;
void main(){
vec3 color = mix(col_froid,col_chaud,temperature);gl_FragColor = vec4(color,1.0);
}
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 20
Exemple : Création des shadersGLhandleARB prog=glCreateProgramObjectARB();GLhandleARB
vertex_s=glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);GLhandleARB
fragment_s=glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
char* src=readFile(‘’vertex.txt’’);glShaderSourceARB(vertex_s,1,(const GLcharARB**)&src,NULL);glCompileShaderARB(vertex_s);
src=readFile(‘’fragment.txt’’);glShaderSourceARB(fragment_s,1,(const GLcharARB**)&src,NULL);glCompileShaderARB(fragment_s);
glAttachObjectARB(prog,vertex_s);glAttachObjectARB(prog,fragment_s);glLinkProgramARB(prog);
int r=0;glGetObjectParameterivARB(prog,GL_OBJECT_LINK_STATUS,&r);
glUseProgramObjectARB(prog);
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 21
Exemple : Attachement des paramètresint temp_min_uni, temp_max_uni, col_min_uni, col_max_uni;int temp_att;
temp_min_uni=glGetUniformLocationARB(prog,’’temp_min’’);temp_max_uni=glGetUniformLocationARB (prog,’’temp_max’’);col_min_uni=glGetUniformLocationARB (prog,’’col_froid’’);col_max_uni=glGetUniformLocationARB (prog,’’col_chaud’’);
temp_att=glGetAttribLocationARB(prog, ’’temperature’’);
glUniform1fARB(temp_min,-10);glUniform1fARB(temp_max,30);glUniform3fARB(col_min,0,0,1);glUniform3fARB(col_min,1,0,0);
glBegin(GL_TRIANGLE);glVertexAttrib1fARB(temp_att,-5);glVertex3f(0,1,0);glVertexAttrib1fARB(temp_att,5);glVertex3f(-1,0,0);glVertexAttrib1fARB(temp_att,15);glVertex3f(1,0,0);glEnd();
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 22
GLSL : le langage
Opérateurs: +, -, *, /, ++, --
Terme à terme sauf : mat * vec, vec*mat (=vec) et mat * mat matrixcompmult(mat,mat) : terme à terme
<=, >=, <, > sur int et float scalaire ==, != terme à terme sur tous les types sauf les tableaux &&, ||, ^^ sur bool (scalaire), (pas d’opérateur bits à bits) =, +=, -=, *=, /=, ?: lessThan(vec, vec), lessThanEqual, equal, notEqual,
greater, greaterThan : terme à terme sur les vecteurs any(bvec), all(bvec), not(bvec)
Indexing et swizzling [n] sur tableau, vec, mat: accède au n-ième élément . permute les éléments :
ivec4 a=ivec4(1,2,3,4); a.wzyx est égal à {4,3,2,1}
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 23
GLSL : le langage
Fonctions cos, sin, tan, acos, asin, atan, radians, degrees pow, exp2, log2, sqrt, inversesqrt abs, sign, floor, ceil, fract, mod, min, max, clamp, step,
smoothstep length, distance, dot, cross, normalize, faceforward, reflect noise (non disponible sur la plupart des cartes)
Structures de contrôle: if, if-else for, while, do-while return, break, discard
Fonctions Paramètres qualifiés : in, out, inout, par défaut : in.
void calcu_coord(in vec3 pos, out coord)
Programme principale: void main()
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 24
Les textures
Dans l’applicationChoisir une unité de texture : glActiveTexture( )Créer une texture et l’associer à l’unité de texture
glBindTexture( )Fixer les paramètres (wrapping, filtering) :
glTexParameter ( )Associer une image glTexImage ( ) Initialiser le sampler du shader : glUniform1i( )
Dans le Shader :Déclarer un uniform de type Sampler (sampler1D,
sampler2D, sampler3D, samplerCube, samplerShadow1D, samplerShadow2D)
Pour accéder à un élement de la texture utiliser la fonction textureXXX (texture1D, …)
texture2D(sampler, coord);
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 25
Programmation
Développez petit à petit et testez souvent!Débuggage très difficile (pas de printf !)
OptimisationRéfléchissez au meilleur endroit pour placer un
calcul:Vertex shader : 1x par sommetFragment shader : 1x par fragment : beaucoup plus
souvent !Si un paramètre change
Vite : fragment shaderLentement : vertex shaderRarement : CPU uniform
Textures pour encoder les fonctions trop complexesUtilisez les fonctions fournies plutôt que de les re-
développez.Choisissez la bonne fonction : inversesqrt a des
chances d’être plus rapide que 1/sqrt.
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 26
Au travail !
Color=AmbientColor+
DiffuseColor * ( N. L )+
SpecularColor * ( V. R )^n
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 27
Calcul par vertex void main() {
gl_Position= gl_ModelViewMatrix* gl_Vertex;vec3 N = normalize(gl_NormalMatrix* gl_Normal);vec3 L = normalize(gl_light[0].position);
gl_FrontColor=gl_FrontMaterial.diffuse*gl_LightSource[0].ambient ;float diffuse = dot(N, L);If (diffuse>0){
gl_FrontColor+= gl_FrontMaterial.diffuse * diffuse *gl_LightSource[0].diffuse;
vec3 R = reflect(-L, N); vec3 V = normalize(-gl_Position.xyz); float specular= dot(V, R);if (specular>0)
gl_FrontColor+= gl_FrontMaterial.specular * pow(specular, gl_FrontMaterial.shininess)*gl_LightSource[0].specular ;
}gl_Position= gl_ProjectionMatrix* gl_Position;
}
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 28
Phong par pixels
Par sommet : on interpole la couleur linéairement entre chaque sommet
Par pixel : Le vertex programme calcule une normale dans le
repère de l’oeil Le fragment programme reçoit une normale
interpolée et réalise le calcul complet avec cette normale
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 29
Le rendu multi passes
Problèmes types:Filtres : besoin d’accéder aux pixels voisinsRendu HDR et tone mapping :
le rendu s’effectue 128 bits (on ne peut pas l’afficher)Séparation du rendu et du tone mapping
Deffered shading : shader très complexe,1ere passe : rendu rapide dans plusieurs buffers
(position, normale, paramètre…)2nd passe : calcul de l’éclairement uniquement pour les
pixels réellement affichésTextures dynamiques (réflexions, …)
Pixel Buffers (lourds, dépendants du système) Frame Buffer Object (FBO)
Contexte de rendu hors écranAssociable à une textureChangement de FBO rapide
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 30
Frame Buffer Object
FBO Contient des buffers de couleurs, stencil, profondeur Multiple render target (MRT) Associable à une texture
Render Buffer Comme FBO, non associé à une texture Read/Write Pixels
Usage (performences décroissantes):Unique FBO, plusieurs textures attachées :
glDrawBufer() pour changer de destinationUnique FBO, plusieurs textures attachées :
FramebufferTexture() pour changerMultiples FBO : BindFramebuffer() pour changer
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 31
API des FBO
Création
void glGenFramebuffersEXT (sizei n, uint *framebuffers) ;
void glDeleteFramebuffersEXT(sizei n, uint *framebuffers) ;
Association comme contexte de rendu
void glBindFramebufferEXT(enum target, uint framebuffer);
target =FRAMEBUFFER_EXT, framebuffer =0 : window,= id du fbo
Vérification de l’état
enum glCheckFramebufferStatusEXT(enum target); FRAME_BUFFER_COMPLETE
Association d’une texture au FBO
void glFramebufferTexture2DEXT(enum target, enum attachment, enum
textarget, uint texture, int level);
target= FRAMEBUFFER_EXT, attachment = COLOR_ATTACHMENT0_EXT, DEPTH_ATTACHMENT_EXT …
textarget=TEXTURE2D,TEXTURE_RECTANGLE,…
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 32
Exemple
GLuintfb, depth_rb, tex;glGenFramebuffersEXT(1, &fb);glGenTextures(1, &tex);
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb);glBindTexture( GL_TEXTURE_2D, tex);glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb);RENDU DANS LA TEXTURE
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0);glBindTexture( GL_TEXTURE_2D, tex);RENDU DANS LA FENETRE AVEC LA TEXTURE
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 33
GPGPU: General Programming on GPU Utiliser la puissance du GPU:
PIV 3Ghz : 12 GFLOPS GeForce6 : 53 GFLOPS (pub Nvidia sur un shader inutile)
Problèmes API liée au graphisme Architecture parallèle Changement du matériel et de l’API fréquent Interface avec le CPU lente
Modèle de programmation: Stream : données devant subir un même traitement Kernel : traitement à appliquer
Implémentation Stream : texture Kernel : fragment program sur un Quad couvrant l’ecran Feed back : Render To Texture (FBO) Enchaînement de passes pour faire progresser les calculs
Langages dédiés : Brook et Sh
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 34
Exemple d’usage non standard du GPU - échantillonnage
Objet à ombrer
Bloqueur
Source de lumière
Image
Pyramide de vision
Lancer de rayons
GPU
Nb échantillonsT
emps
Calcul de la visibilité par le GPU Fin du calcul sur le CPU
Pondération de chaque pixel Source surfacique quelconque
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 35
L’échantillonnage perturbé (jittered sampling)
12 pixels dans la source 16 pixels dans la source
14 pixels dans la source
Échantillonnage régulier
Bandes dans les ombres
Échantillonnage perturbéPerturbation aléatoire ou quasi aléatoireLancer de rayons : facileGPU: pas prévu
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 36
Éclairement direct
Échantillonnage régulier
48x48 x1
Bandes
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 37
Éclairement direct
Échantillonnage perturbé
48x48 x1
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 38
Fragment program
Rastérization dans le Fragment Program Test d’appartenance d’un fragment au triangle
Projection non linéaire Perturbation du centre du
fragment avec les dérivées
DDX et DDY Dilatation du triangle dessiné
A
B
C
P
R
DDY(αP,βP)
DDX(αP,βP)(αP,βP)
(0,0)
(1,0)
(0,1)
Fragment
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 39
Fragment program
Rastérization dans le Fragment Program Test d’appartenance d’un fragment au triangle
Ad
Bd
Cd
Fragment
Triangle à dessiner
A
B
C
P
R
DDY(αP,βP)
(αP,βP)
(0,0)
(1,0)
(0,1)
Triangle dilaté
Projection non linéaire Perturbation du centre du
fragment avec les dérivées
DDX et DDY Dilatation du triangle dessiné
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU
19/01/2006 Gabriel Fournier 40
Le futur
DirectX 10 : Shader Model 4 Geometry shader :
Crée de la géométrie Combine les sommets en triangles
Random Random Access Access ReadsReads
Input AssemblerInput Assembler
Vertex ShaderVertex Shader
TessellatorTessellator
Vertex ShaderVertex Shader
SerialSerialAccessAccessStreamsStreams Geometry ShaderGeometry Shader
RasterizerRasterizer
Pixel ShaderPixel Shader
Render TargetRender Target
ReusableReusableStreamStreamOutputOutputReusableReusable
StreamStreamOutputOutput
Opt
ion
alO
ptio
nal
Pipeline
Shaders
Interaction
GLSL
Multi passe
GPGPU