OpenGL 2.0 -- GLSL - Page de David Odin

30
OpenGL 2.0 – GLSL David Odin Septembre 2007 David Odin () OpenGL 2.0 – GLSL Septembre 2007 1 / 13

Transcript of OpenGL 2.0 -- GLSL - Page de David Odin

Page 1: OpenGL 2.0 -- GLSL - Page de David Odin

OpenGL 2.0 – GLSL

David Odin

Septembre 2007

David Odin () OpenGL 2.0 – GLSL Septembre 2007 1 / 13

Page 2: OpenGL 2.0 -- GLSL - Page de David Odin

OPENGL 2.0 – GLSL

1 QU’ EST-CE QU’ UN SHADER ?Les differents types de shadersExemples simples

David Odin () OpenGL 2.0 – GLSL Septembre 2007 2 / 13

Page 3: OpenGL 2.0 -- GLSL - Page de David Odin

DEFINITION

A l’origine, script utilisant le multitexturage pour realiser des effets(voir Quake 3 Arena)

David Odin () OpenGL 2.0 – GLSL Septembre 2007 3 / 13

Page 4: OpenGL 2.0 -- GLSL - Page de David Odin

DEFINITION

A l’origine, script utilisant le multitexturage pour realiser des effets(voir Quake 3 Arena)

Par extension, programme permettant de calculer la couleur d’unpixel

David Odin () OpenGL 2.0 – GLSL Septembre 2007 3 / 13

Page 5: OpenGL 2.0 -- GLSL - Page de David Odin

DEFINITION

A l’origine, script utilisant le multitexturage pour realiser des effets(voir Quake 3 Arena)

Par extension, programme permettant de calculer la couleur d’unpixel

Maintenant : programme execute directement par le GPU

David Odin () OpenGL 2.0 – GLSL Septembre 2007 3 / 13

Page 6: OpenGL 2.0 -- GLSL - Page de David Odin

DEFINITION

A l’origine, script utilisant le multitexturage pour realiser des effets(voir Quake 3 Arena)

Par extension, programme permettant de calculer la couleur d’unpixel

Maintenant : programme execute directement par le GPU

Differents langages : Cg, Sh, HLSL, GLSL (celui d’OpenGL,ressemble a du C)

David Odin () OpenGL 2.0 – GLSL Septembre 2007 3 / 13

Page 7: OpenGL 2.0 -- GLSL - Page de David Odin

OPENGL 2.0 – GLSL

1 QU’ EST-CE QU’ UN SHADER ?Les differents types de shadersExemples simples

David Odin () OpenGL 2.0 – GLSL Septembre 2007 4 / 13

Page 8: OpenGL 2.0 -- GLSL - Page de David Odin

FRAGMENT SHADER

Ou “Pixel shader”.Determine la couleur d’un pixel (ou d’un fragment) en fonction de :

la couleur interpolee

David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13

Page 9: OpenGL 2.0 -- GLSL - Page de David Odin

FRAGMENT SHADER

Ou “Pixel shader”.Determine la couleur d’un pixel (ou d’un fragment) en fonction de :

la couleur interpolee

la normale interpolee

David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13

Page 10: OpenGL 2.0 -- GLSL - Page de David Odin

FRAGMENT SHADER

Ou “Pixel shader”.Determine la couleur d’un pixel (ou d’un fragment) en fonction de :

la couleur interpolee

la normale interpolee

les coordonnees de textures interpolees

David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13

Page 11: OpenGL 2.0 -- GLSL - Page de David Odin

FRAGMENT SHADER

Ou “Pixel shader”.Determine la couleur d’un pixel (ou d’un fragment) en fonction de :

la couleur interpolee

la normale interpolee

les coordonnees de textures interpolees

les textures courantes

David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13

Page 12: OpenGL 2.0 -- GLSL - Page de David Odin

FRAGMENT SHADER

Ou “Pixel shader”.Determine la couleur d’un pixel (ou d’un fragment) en fonction de :

la couleur interpolee

la normale interpolee

les coordonnees de textures interpolees

les textures courantes

des variables “utilisateurs” (uniformes ou interpolees)

David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13

Page 13: OpenGL 2.0 -- GLSL - Page de David Odin

FRAGMENT SHADER

Ou “Pixel shader”.Determine la couleur d’un pixel (ou d’un fragment) en fonction de :

la couleur interpolee

la normale interpolee

les coordonnees de textures interpolees

les textures courantes

des variables “utilisateurs” (uniformes ou interpolees)

etc.

David Odin () OpenGL 2.0 – GLSL Septembre 2007 5 / 13

Page 14: OpenGL 2.0 -- GLSL - Page de David Odin

VERTEX SHADER

Determine la position (dans l’espace de l’ecran) du vertex courant

David Odin () OpenGL 2.0 – GLSL Septembre 2007 6 / 13

Page 15: OpenGL 2.0 -- GLSL - Page de David Odin

VERTEX SHADER

Determine la position (dans l’espace de l’ecran) du vertex courant

Positionne les variables qui seront interpolees par le fragmentshader

David Odin () OpenGL 2.0 – GLSL Septembre 2007 6 / 13

Page 16: OpenGL 2.0 -- GLSL - Page de David Odin

GEOMETRY SHADER

Introduit avec les processeurs G80 chez NVidia

David Odin () OpenGL 2.0 – GLSL Septembre 2007 7 / 13

Page 17: OpenGL 2.0 -- GLSL - Page de David Odin

GEOMETRY SHADER

Introduit avec les processeurs G80 chez NVidia

Permet de generer des vertex a partir d’autres vertex

David Odin () OpenGL 2.0 – GLSL Septembre 2007 7 / 13

Page 18: OpenGL 2.0 -- GLSL - Page de David Odin

OPENGL 2.0 – GLSL

1 QU’ EST-CE QU’ UN SHADER ?Les differents types de shadersExemples simples

David Odin () OpenGL 2.0 – GLSL Septembre 2007 8 / 13

Page 19: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTIONSOPENGL 2.0

Pour supporter les shaders, OpenGL introduit quelques fonctions :

glCreateShader() permet de creer un “objet shader”.exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER);

David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13

Page 20: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTIONSOPENGL 2.0

Pour supporter les shaders, OpenGL introduit quelques fonctions :

glCreateShader() permet de creer un “objet shader”.exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER);

glShaderSource() permet d’indiquer le code source d’un shaderexemple : glShaderSource (VS, 1, &vertexTab, NULL);

David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13

Page 21: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTIONSOPENGL 2.0

Pour supporter les shaders, OpenGL introduit quelques fonctions :

glCreateShader() permet de creer un “objet shader”.exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER);

glShaderSource() permet d’indiquer le code source d’un shaderexemple : glShaderSource (VS, 1, &vertexTab, NULL);

glCompileShader () permet de compiler le shader (le code restesur le GPU)exemple : glCompileShader (VS);

David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13

Page 22: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTIONSOPENGL 2.0

Pour supporter les shaders, OpenGL introduit quelques fonctions :

glCreateShader() permet de creer un “objet shader”.exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER);

glShaderSource() permet d’indiquer le code source d’un shaderexemple : glShaderSource (VS, 1, &vertexTab, NULL);

glCompileShader () permet de compiler le shader (le code restesur le GPU)exemple : glCompileShader (VS);

glCreateProgram() permet de creer un objet programme (unremplacement d’une partie du pipeline)exemple : Prog = glCreateProgram ();

David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13

Page 23: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTIONSOPENGL 2.0

Pour supporter les shaders, OpenGL introduit quelques fonctions :

glCreateShader() permet de creer un “objet shader”.exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER);

glShaderSource() permet d’indiquer le code source d’un shaderexemple : glShaderSource (VS, 1, &vertexTab, NULL);

glCompileShader () permet de compiler le shader (le code restesur le GPU)exemple : glCompileShader (VS);

glCreateProgram() permet de creer un objet programme (unremplacement d’une partie du pipeline)exemple : Prog = glCreateProgram ();

glAttachShader() permet d’ajouter un code objet a un programmeexemple : glAttachShader (Prog, FS);

David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13

Page 24: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTIONSOPENGL 2.0

Pour supporter les shaders, OpenGL introduit quelques fonctions :

glCreateShader() permet de creer un “objet shader”.exemple : GLuint FS = glCreateShader (GL FRAGMENT SHADER);

glShaderSource() permet d’indiquer le code source d’un shaderexemple : glShaderSource (VS, 1, &vertexTab, NULL);

glCompileShader () permet de compiler le shader (le code restesur le GPU)exemple : glCompileShader (VS);

glCreateProgram() permet de creer un objet programme (unremplacement d’une partie du pipeline)exemple : Prog = glCreateProgram ();

glAttachShader() permet d’ajouter un code objet a un programmeexemple : glAttachShader (Prog, FS);

glLinkProgram() realise l’edition de lienexemple : glLinkProgram (Prog);

David Odin () OpenGL 2.0 – GLSL Septembre 2007 9 / 13

Page 25: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTION OPENGL 2.0 SUITE

Pour manipuler un programme shader, on peut utiliser les fonctionssuivantes :

glUseProgram() indique d’utiliser ce programme a la place dupipeline (0 permet de retrouver le pipeline traditionnel)exemple : glUseProgram(Prog)

David Odin () OpenGL 2.0 – GLSL Septembre 2007 10 / 13

Page 26: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTION OPENGL 2.0 SUITE

Pour manipuler un programme shader, on peut utiliser les fonctionssuivantes :

glUseProgram() indique d’utiliser ce programme a la place dupipeline (0 permet de retrouver le pipeline traditionnel)exemple : glUseProgram(Prog)

glGetUniformLocation() permet de recuperer un handle sur unevariable globale d’un programmeexemple : glGetUniformLocation(Prog, ”BrickColor”);

David Odin () OpenGL 2.0 – GLSL Septembre 2007 10 / 13

Page 27: OpenGL 2.0 -- GLSL - Page de David Odin

FONCTION OPENGL 2.0 SUITE

Pour manipuler un programme shader, on peut utiliser les fonctionssuivantes :

glUseProgram() indique d’utiliser ce programme a la place dupipeline (0 permet de retrouver le pipeline traditionnel)exemple : glUseProgram(Prog)

glGetUniformLocation() permet de recuperer un handle sur unevariable globale d’un programmeexemple : glGetUniformLocation(Prog, ”BrickColor”);

glUniform*() permet de changer la valeur d’une variable globaled’un programmeexemple : glUniform3f (glGetUniformLocation (Prog, ”BrickColor”), 1.0, 0.3, 0.2);

David Odin () OpenGL 2.0 – GLSL Septembre 2007 10 / 13

Page 28: OpenGL 2.0 -- GLSL - Page de David Odin

EXEMPLE DE FRAGMENT SHADER

Le plus simple possible.void main ( void ){

g l FragCo lo r = vec4 ( 1 . 0 , 0 .0 , 1 .0 , 1 . 0 ) ;}

David Odin () OpenGL 2.0 – GLSL Septembre 2007 11 / 13

Page 29: OpenGL 2.0 -- GLSL - Page de David Odin

FRAGMENT SHADER “ MUR DE BRIQUE”

uniform vec3 Br ickCo lo r , MortarColor ;uni form vec2 Br ickSize ;uni form vec2 Br ickPc t ;

va ry ing vec2 MCposit ion ;va ry ing f l oa t 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 , useBr ick ;

p o s i t i o n = MCposit ion / Br ickSize ;

i f ( f r a c t ( p o s i t i o n . y ∗ 0 . 5 ) > 0 . 5 )p o s i t i o n . x += 0 . 5 ;

p o s i t i o n = f r a c t ( p o s i t i o n ) ;

useBr ick = step ( p o s i t i o n , Br ickPc t ) ;

c o l o r = mix ( MortarColor , Br ickCo lo r , useBr ick . x ∗ useBr ick . y ) ;c o l o r ∗= L i g h t I n t e n s i t y ;g l FragCo lo r = vec4 ( co lo r , 1 . 0 ) ;

}

David Odin () OpenGL 2.0 – GLSL Septembre 2007 12 / 13

Page 30: OpenGL 2.0 -- GLSL - Page de David Odin

VERTEX SHADER “ MUR DE BRIQUE”

uniform vec3 L i g h t Po s i t i o n ;

const f l oa t Specu la rCon t r ibu t ion = 0 . 5 ;const f l oa t D i f f u s e C o n t r i b u t i o n = 1.0 − Specu la rCon t r ibu t ion ;

va ry ing f l oa t L i g h t I n t e n s i t y ;va ry ing vec2 MCposit ion ;

void main ( void ){

vec3 ecPos i t ion = vec3 ( gl ModelViewMatr ix ∗ g l Ve r t e x ) ;vec3 tnorm = normal ize ( g l Norma lMat r ix ∗ gl Normal ) ;vec3 l i g h t Ve c = normal ize ( L i g h t Po s i t i o n − ecPos i t ion ) ;vec3 r e f l e c t Ve c = r e f l e c t (− l i gh tVec , tnorm ) ;vec3 viewVec = normal ize(−ecPos i t ion ) ;f l oa t d i f f u s e = max( dot ( l igh tVec , tnorm ) , 0 . 0 ) ;f l oa t spec = 0 . 0 ;

i f ( d i f f u s e > 0 . 0 ){

spec = max( dot ( re f lec tVec , viewVec ) , 0 . 0 ) ;spec = pow( spec , 5 6 . 0 ) ;

}

L i g h t I n t e n s i t y = D i f f u s e C o n t r i b u t i o n ∗ d i f f u s e +Specu la rCon t r ibu t ion ∗ spec ;

MCposi t ion = g l Ve r t e x . xy ;g l P o s i t i o n = f t r a n s f o r m ( ) ;

}

David Odin () OpenGL 2.0 – GLSL Septembre 2007 13 / 13