OpenGL 2.0 -- GLSL
Transcription
OpenGL 2.0 -- GLSL
OpenGL 2.0 – GLSL David Odin Septembre 2007 David Odin () OpenGL 2.0 – GLSL Septembre 2007 1 / 13 O PEN GL 2.0 – GLSL 1 Q U ’ EST- CE QU ’ UN SHADER ? Les différents types de shaders Exemples simples David Odin () OpenGL 2.0 – GLSL Septembre 2007 2 / 13 D ÉFINITION A l’origine, script utilisant le multitexturage pour réaliser des effets (voir Quake 3 Aréna) David Odin () OpenGL 2.0 – GLSL Septembre 2007 3 / 13 D ÉFINITION A l’origine, script utilisant le multitexturage pour réaliser des effets (voir Quake 3 Aréna) Par extension, programme permettant de calculer la couleur d’un pixel David Odin () OpenGL 2.0 – GLSL Septembre 2007 3 / 13 D ÉFINITION A l’origine, script utilisant le multitexturage pour réaliser des effets (voir Quake 3 Aréna) Par extension, programme permettant de calculer la couleur d’un pixel Maintenant : programme exécuté directement par le GPU David Odin () OpenGL 2.0 – GLSL Septembre 2007 3 / 13 D ÉFINITION A l’origine, script utilisant le multitexturage pour réaliser des effets (voir Quake 3 Aréna) Par extension, programme permettant de calculer la couleur d’un pixel Maintenant : programme exécuté directement par le GPU Différents langages : Cg, Sh, HLSL, GLSL (celui d’OpenGL, ressemble à du C) David Odin () OpenGL 2.0 – GLSL Septembre 2007 3 / 13 O PEN GL 2.0 – GLSL 1 Q U ’ EST- CE QU ’ UN SHADER ? Les différents types de shaders Exemples simples David Odin () OpenGL 2.0 – GLSL Septembre 2007 4 / 13 F RAGMENT S HADER Ou “Pixel shader”. Détermine la couleur d’un pixel (ou d’un fragment) en fonction de : la couleur interpolée David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13 F RAGMENT S HADER Ou “Pixel shader”. Détermine la couleur d’un pixel (ou d’un fragment) en fonction de : la couleur interpolée la normale interpolée David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13 F RAGMENT S HADER Ou “Pixel shader”. Détermine la couleur d’un pixel (ou d’un fragment) en fonction de : la couleur interpolée la normale interpolée les coordonnées de textures interpolées David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13 F RAGMENT S HADER Ou “Pixel shader”. Détermine la couleur d’un pixel (ou d’un fragment) en fonction de : la couleur interpolée la normale interpolée les coordonnées de textures interpolées les textures courantes David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13 F RAGMENT S HADER Ou “Pixel shader”. Détermine la couleur d’un pixel (ou d’un fragment) en fonction de : la couleur interpolée la normale interpolée les coordonnées de textures interpolées les textures courantes des variables “utilisateurs” (uniformes ou interpolées) David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13 F RAGMENT S HADER Ou “Pixel shader”. Détermine la couleur d’un pixel (ou d’un fragment) en fonction de : la couleur interpolée la normale interpolée les coordonnées de textures interpolées les textures courantes des variables “utilisateurs” (uniformes ou interpolées) etc. David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13 V ERTEX S HADER Détermine la position (dans l’espace de l’écran) du vertex courant David Odin () OpenGL 2.0 – GLSL Septembre 2007 6 / 13 V ERTEX S HADER Détermine la position (dans l’espace de l’écran) du vertex courant Positionne les variables qui seront interpolées par le fragment shader David Odin () OpenGL 2.0 – GLSL Septembre 2007 6 / 13 G EOMETRY S HADER Introduit avec les processeurs G80 chez NVidia David Odin () OpenGL 2.0 – GLSL Septembre 2007 7 / 13 G EOMETRY S HADER Introduit avec les processeurs G80 chez NVidia Permet de générer des vertex à partir d’autres vertex David Odin () OpenGL 2.0 – GLSL Septembre 2007 7 / 13 O PEN GL 2.0 – GLSL 1 Q U ’ EST- CE QU ’ UN SHADER ? Les différents types de shaders Exemples simples David Odin () OpenGL 2.0 – GLSL Septembre 2007 8 / 13 F ONCTIONS O PEN GL 2.0 Pour supporter les shaders, OpenGL introduit quelques fonctions : glCreateShader() permet de créer un “objet shader”. exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER); David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13 F ONCTIONS O PEN GL 2.0 Pour supporter les shaders, OpenGL introduit quelques fonctions : glCreateShader() permet de créer un “objet shader”. exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER); glShaderSource() permet d’indiquer le code source d’un shader exemple : glShaderSource (VS, 1, &vertexTab, NULL); David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13 F ONCTIONS O PEN GL 2.0 Pour supporter les shaders, OpenGL introduit quelques fonctions : glCreateShader() permet de créer un “objet shader”. exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER); glShaderSource() permet d’indiquer le code source d’un shader exemple : glShaderSource (VS, 1, &vertexTab, NULL); glCompileShader () permet de compiler le shader (le code reste sur le GPU) exemple : glCompileShader (VS); David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13 F ONCTIONS O PEN GL 2.0 Pour supporter les shaders, OpenGL introduit quelques fonctions : glCreateShader() permet de créer un “objet shader”. exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER); glShaderSource() permet d’indiquer le code source d’un shader exemple : glShaderSource (VS, 1, &vertexTab, NULL); glCompileShader () permet de compiler le shader (le code reste sur le GPU) exemple : glCompileShader (VS); glCreateProgram() permet de créer un objet programme (un remplacement d’une partie du pipeline) exemple : Prog = glCreateProgram (); David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13 F ONCTIONS O PEN GL 2.0 Pour supporter les shaders, OpenGL introduit quelques fonctions : glCreateShader() permet de créer un “objet shader”. exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER); glShaderSource() permet d’indiquer le code source d’un shader exemple : glShaderSource (VS, 1, &vertexTab, NULL); glCompileShader () permet de compiler le shader (le code reste sur le GPU) exemple : glCompileShader (VS); glCreateProgram() permet de créer un objet programme (un remplacement d’une partie du pipeline) exemple : Prog = glCreateProgram (); glAttachShader() permet d’ajouter un code objet à un programme exemple : glAttachShader (Prog, FS); David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13 F ONCTIONS O PEN GL 2.0 Pour supporter les shaders, OpenGL introduit quelques fonctions : glCreateShader() permet de créer un “objet shader”. exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER); glShaderSource() permet d’indiquer le code source d’un shader exemple : glShaderSource (VS, 1, &vertexTab, NULL); glCompileShader () permet de compiler le shader (le code reste sur le GPU) exemple : glCompileShader (VS); glCreateProgram() permet de créer un objet programme (un remplacement d’une partie du pipeline) exemple : Prog = glCreateProgram (); glAttachShader() permet d’ajouter un code objet à un programme exemple : glAttachShader (Prog, FS); glLinkProgram() réalise l’édition de lien exemple : glLinkProgram (Prog); David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13 F ONCTION O PEN GL 2.0 SUITE Pour manipuler un programme shader, on peut utiliser les fonctions suivantes : glUseProgram() indique d’utiliser ce programme à la place du pipeline (0 permet de retrouver le pipeline traditionnel) exemple : glUseProgram(Prog) David Odin () OpenGL 2.0 – GLSL Septembre 2007 10 / 13 F ONCTION O PEN GL 2.0 SUITE Pour manipuler un programme shader, on peut utiliser les fonctions suivantes : glUseProgram() indique d’utiliser ce programme à la place du pipeline (0 permet de retrouver le pipeline traditionnel) exemple : glUseProgram(Prog) glGetUniformLocation() permet de récuperer un handle sur une variable globale d’un programme exemple : glGetUniformLocation(Prog, ”BrickColor”); David Odin () OpenGL 2.0 – GLSL Septembre 2007 10 / 13 F ONCTION O PEN GL 2.0 SUITE Pour manipuler un programme shader, on peut utiliser les fonctions suivantes : glUseProgram() indique d’utiliser ce programme à la place du pipeline (0 permet de retrouver le pipeline traditionnel) exemple : glUseProgram(Prog) glGetUniformLocation() permet de récuperer un handle sur une variable globale d’un programme exemple : glGetUniformLocation(Prog, ”BrickColor”); glUniform*() permet de changer la valeur d’une variable globale d’un programme exemple : glUniform3f (glGetUniformLocation (Prog, ”BrickColor”), 1.0, 0.3, 0.2); David Odin () OpenGL 2.0 – GLSL Septembre 2007 10 / 13 E XEMPLE DE FRAGMENT SHADER Le plus simple possible. void main ( void ) { g l F r a g C o l o r = vec4 ( 1 . 0 , 0 . 0 , 1 . 0 , 1 . 0 ) ; } David Odin () OpenGL 2.0 – GLSL Septembre 2007 11 / 13 F RAGMENT S HADER “ MUR DE BRIQUE ” u n if o r m vec3 u n if o r m vec2 u n if o r m vec2 B r i c k C o l o r , Mo r t a r C o lo r ; BrickSize ; BrickPct ; v a r y i n g vec2 MC p o s it io n ; varying float L i g h t I n t e n s i t y ; void main ( void ) { vec3 c o l o r ; vec2 p o s i t i o n , u s e Br ic k ; p o s i t i o n = MC p o s it io n / B r i c k S i z e ; i f ( fr ac t ( position . y ∗ 0.5) > 0.5) p o s i t i o n . x += 0 . 5 ; position = f rac t ( position ) ; u s e Br ic k = s t e p ( p o s i t i o n , B r i c k P c t ) ; c o l o r = mix ( Mo r t a r C o lo r , B r i c k C o l o r , u s e Br ic k . x ∗ u s e Br ic k . y ) ; c o l o r ∗= L i g h t I n t e n s i t y ; g l F r a g C o l o r = vec4 ( c o l o r , 1 . 0 ) ; } David Odin () OpenGL 2.0 – GLSL Septembre 2007 12 / 13 V ERTEX S HADER “ MUR DE BRIQUE ” u n if o r m vec3 L i g h t P o s i t i o n ; const f l o a t S p e c u l a r C o n t r i b u t i o n = 0 . 5 ; const f l o a t D i f f u s e C o n t r i b u t i o n = 1 . 0 − S p e c u l a r C o n t r i b u t i o n ; varying float L i g h t I n t e n s i t y ; v a r y i n g vec2 MC p o s it io n ; void main ( void ) { vec3 e c P o s i t i o n vec3 tnorm vec3 l i g h t V e c vec3 r e f l e c t V e c vec3 viewVec float diffuse f l o a t spec = = = = = = = vec3 ( g l Mo d e lVie w Ma t r ix ∗ g l V e r t e x ) ; n o r ma liz e ( g l N o r m a l M a t r i x ∗ g l N o r ma l ) ; n o r ma liz e ( L i g h t P o s i t i o n − e c P o s i t i o n ) ; r e f l e c t (− l i g h t V e c , tnorm ) ; n o r ma liz e (− e c P o s i t i o n ) ; max ( d o t ( l i g h t V e c , tnorm ) , 0 . 0 ) ; 0.0; i f ( diffuse > 0.0) { spec = max ( d o t ( r e f l e c t V e c , viewVec ) , 0 . 0 ) ; spec = pow ( spec , 5 6 . 0 ) ; } LightIntensity = DiffuseContribution ∗ diffuse + S p e c u l a r C o n t r i b u t i o n ∗ spec ; MC p o s it io n gl Position = g l V e r t e x . xy ; = ftransform ( ) ; } David Odin () OpenGL 2.0 – GLSL Septembre 2007 13 / 13