gKit2 light
tuto9_materials.glsl
Go to the documentation of this file.
1 
3 #version 330
4 
5 #ifdef VERTEX_SHADER
6 layout(location= 0) in vec3 position;
7 layout(location= 2) in vec3 normal;
8 layout(location= 4) in uint material;
9 
10 uniform mat4 mvpMatrix;
11 uniform mat4 mvMatrix;
12 
13 out vec3 vertex_position;
14 out vec3 vertex_normal;
15 flat out uint vertex_material;
16 /* decoration flat : le varying est un entier, donc pas vraiment interpolable... il faut le declarer explicitement */
17 
18 void main( )
19 {
20  gl_Position= mvpMatrix * vec4(position, 1);
21 
22  // position et normale dans le repere camera
23  vertex_position= vec3(mvMatrix * vec4(position, 1));
24  vertex_normal= mat3(mvMatrix) * normal;
25  // ... comme d'habitude
26 
27  // et transmet aussi l'indice de la matiere au fragment shader...
28  vertex_material= material;
29 }
30 
31 #endif
32 
33 
34 #ifdef FRAGMENT_SHADER
35 out vec4 fragment_color;
36 
37 in vec3 vertex_position;
38 in vec3 vertex_normal;
39 flat in uint vertex_material; // !! decoration flat, le varying est marque explicitement comme non interpolable !!
40 
41 #define MAX_MATERIALS 16
42 uniform vec4 materials[MAX_MATERIALS];
43 
44 void main( )
45 {
46  vec3 l= normalize(-vertex_position); // la camera est la source de lumiere.
47  vec3 n= normalize(vertex_normal);
48  float cos_theta= max(0, dot(n, l));
49 
50  // recupere la couleur de la matiere du triangle, en fonction de son indice.
51  vec4 color= materials[vertex_material];
52  fragment_color= color * cos_theta;
53 }
54 
55 #endif
Point max(const Point &a, const Point &b)
renvoie la plus grande composante de chaque point. x, y, z= max(a.x, b.x), max(a.y,...
Definition: vec.cpp:35
float dot(const Vector &u, const Vector &v)
renvoie le produit scalaire de 2 vecteurs.
Definition: vec.cpp:137
Vector normalize(const Vector &v)
renvoie un vecteur unitaire / longueur == 1.
Definition: vec.cpp:123
vecteur generique, utilitaire.
Definition: vec.h:146
vecteur generique 4d, ou 3d homogene, utilitaire.
Definition: vec.h:168