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

Documents pareils