Les Processeurs Graphiques Programmables P. Gautron
Plan Structure Programmation Applications
Plan Structure Programmation Applications
Structure globale du GPU Matrices Géométrie Géométrie transformée Vertex Shader Image finale Fragment Shader Rasterizer Sources lumineuses, …
Géométrie transformée Vertex Shader Rôle : projeter chaque sommet dans le plan image Vertex Shader Géométrie Géométrie transformée Vertex Shader Vertex Shader Vertex Shader
Structure globale du GPU Matrices Géométrie Géométrie transformée Vertex Shader Image finale Fragment Shader Rasterizer Sources lumineuses, …
Rasterizer Rôle : remplissage de polygônes
Rasterizer Rôle : remplissage de polygônes V2 Scan Line I1 IP I2 V1 V3 : Interpolation Linéaire
Structure globale du GPU Matrices Géométrie Géométrie transformée Vertex Shader Image finale Fragment Shader Rasterizer Sources lumineuses, …
Géométrie transformée Fragment Shader Rôle : calculer la “couleur” de chaque fragment Fragment Shader Géométrie transformée Image finale Fragment Shader Fragment Shader Fragment Shader
GPU en Pratique Calcul parallèle Implique: Indépendance des sommets/fragments Vertex shader lit depuis textures + variables uniformes Vertex shader écrit position sur l’écran + variables Fragment shader lit depuis textures + variables Fragment shader écrit à 1 position dans le frame buffer
GPU en Pratique Architecture Implique: Textures = tableaux Pas de SD complexes Pas de pointeurs Vertex shader ne "connaît" que le sommet en cours Fragment shader ne "connaît" que le fragment en cours Les vertex et fragment shaders doivent être simples
GPU : Mécanismes Câblés Backface Culling : Elimination des faces non visibles
GPU : Mécanismes Câblés Backface Culling : Elimination des faces non visibles Test : Orientation N V.N > 0 V V N V.N < 0
GPU : Mécanismes Câblés Deph test : résolution des occlusions Z < Z ?
GPU : Mécanismes Câblés Alpha Blending : mélange α α
Plan Structure Programmation Applications
OpenGL : Machine à Etats glColor( ) glBindTexture( ) glTexCoord((u,v)) glNormal( ) Etats Color Color TexCoord (u,v) Texture Texture Normal Pipeline Vertex Shader Fragment Shader Rasterizer Tests glVertex
Description de Géométrie Réglage de la valeur des états Envoi au pipeline glBegin( {GL_LINES | GL_TRIANGLES | GL_QUADS | … }) glTexCoord{1|2|3|4}{i|f|d}( texture_coord ); glColor{1|2|3|4}{i|f|d}( color ); glVertex[1|2|3|4}{f|d} ( vertexPos); glEnd(); glBindTexture(GL_TEXTURE_2D, tex);
Description des Transformations But : Spécifier la projection de la géométrie dans le plan image 2 matrices 4x4 : ModelView : Positionnement de la géométrie glTranslate(), glRotate(), … Positionnement du point de vue gluLookAt() Projection : Type de camera glOrtho(), gluPerspective() Utilisées dans le vertex shader
Projection du sommet sur l’image Vertex Shader Câblé void main() { gl_Position = gl_ModelviewMatrix * gl_ProjectionMatrix * gl_Vertex; color = gl_Color; texCoord = gl_TexCoord; lighting = computeLighting(gl_Normal, color); } Projection du sommet sur l’image Envoi des attributs pour interpolation Calcul de l’éclairage par sommet
Calcul de la couleur du fragment Fragment Shader Câblé void main() { gl_FragColor = color* texture2D(tex, texCoord)* lighting; gl_FragDepth = gl_Position.z; } Calcul de la couleur du fragment Calcul de la profondeur du fragment
Shaders Programmables : GLSL glEnum vs = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); glEnum fs = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB) glEnum program = glCreateProgramObjectARB() Création glShaderSourceARB(vs, 1, VSSourceString, NULL); glCompileShaderARB(vs); glShaderSourceARB(fs, 1, FSSourceString, NULL); glCompileShaderARB(fs); glAttachObjectARB(program, vs); glAttachObjectARB(program, fs); glLinkProgramARB(program); Compilation Destruction glDeleteObjectARB(vs); glDeleteObjectARB(fs); glDeleteObjectARB(program);
Shaders Programmables : GLSL Utilisation glUseProgramObjectARB(program); glBegin( {GL_LINES | GL_TRIANGLES | GL_QUADS | … }) glTexCoord{1|2|3|4}{i|f|d}( texture_coord ); glColor{1|2|3|4}{i|f|d}( color ); glVertex[1|2|3|4}{f|d} ( vertexPos); glEnd(); glBindTexture(GL_TEXTURE_2D, tex); Nb : Retour au shaders câblés par glUseProgramObjectARB(0);
GLSL Types de données Variables Scalaires : float, half, int Vecteurs : vec2, vec3, vec4, hvec2, hvec3, hvec4 Matrices : mat3, mat4 Textures : sampler1D, sampler2D, sampler3D Variables uniform : définies une fois pour toutes dans le programme Exemples : ID de textures, sources lumineuses, matrices Envoi des valeurs par glSet{Int|Float}Uniform() varying : calculées dans le VS, interpolées et envoyées au FS Exemples : couleur, coordonnées de texture
Exemple : Placage de texture Vertex Shader Fragment Shader varying vec4 color; varying vec4 texCoord; void main() { gl_Position = gl_ProjectionMatrix* gl_ModelviewMatrix * gl_Vertex; color = gl_Color; texCoord = gl_TexCoord; } varying vec4 color; varying vec4 texCoord; uniform sampler2D tex; void main() { gl_FragColor = color* texture2D(tex, texCoord); }
Plan Structure Programmation Applications
MultiTexturing Vertex Shader Fragment Shader varying vec4 color; varying vec4 texCoord; void main() { gl_Position = gl_ProjectionMatrix* gl_ModelviewMatrix * gl_Vertex; color = gl_Color; texCoord = gl_TexCoord; } varying vec4 color; varying vec4 texCoord; uniform sampler2D tex1; uniform sampler2D tex2; uniform sampler2D tex3; void main() { gl_FragColor = color* texture2D(tex1, texCoord)* texture2D(tex2, texCoord)+ texture2D(tex3, texCoord) }
Eclairage par Pixel Vertex Shader Fragment Shader varying vec4 color; varying vec4 texCoord; varying vec3 normal; varying vec4 pos; uniform sampler2D tex; void main() { gl_FragColor = color* texture2D(tex, texCoord); gl_FragColor *= lighting(normal); } vec4 lighting(vec3 normal) vec4 lightDir = normalize( gl_LightSource[0].position – pos); return gl_LightSource[0].color* max( 0.0, dot( normal, lightDir)); varying vec4 color; varying vec4 texCoord; varying vec3 normal; varying vec4 pos; void main() { pos = gl_ModelviewMatrix* gl_Vertex; gl_Position = gl_ProjectionMatrix* gl_ModelviewMatrix * color = gl_Color; texCoord = gl_TexCoord; normal = gl_Normal; }
Géométrie transformée Render-To-Texture Idée : réutiliser le résultat d’une passe de rendu dans une autre Géométrie Géométrie transformée Vertex Shader Image finale Fragment Shader Rasterizer Sources lumineuses, …
Géométrie transformée Render-To-Texture Idée : réutiliser le résultat d’une passe de rendu dans une autre Géométrie Géométrie transformée Vertex Shader Image finale Fragment Shader Rasterizer Texture Données…
GPGPU But : effectuer des calculs parallèles sur GPU Comment : en exploitant le parallélisme des vertex/fragment shaders Idée de base : faire un calcul séparé pour chaque fragment, et récupérer les résultats
Liens OpenGL (FR) : http://raphaello.univ-fcomte.fr/IG/Default.htm Tutoriaux, OpenGL 1.1 OpenGL (EN) : http://opengl.org/ Spécifications, Exemples OpenGL (EN) : http://opengl.org/ Spécifications OpenGL et GLSL, Exemples OpenGL pour les jeux (EN) : http://nehe.gamedev.net/ Tutoriaux, OpenGL avancé avec shaders Edition intuitive de shaders : http://developer.nvidia.com/object/fx_composer_home.html http://www.ati.com/developer/rendermonkey/ Calcul parallèle sur GPU (EN) : www.gpgpu.org
Livres
Livres