Bonjour tout le monde,
j'essaye d'implémenter un algorithme de bump-mapping. Malheureusement en voyant mon rendu je pense que j'ai quelque chose qui cloche. Par contre, étant donné que je n'ai rien pour "comparer", je ne sais pas si c'est juste moi ou si j'ai réellement foiré quelque part.
Je poste donc le vertex/fragment shader, ainsi qu'un lien avec deux rendus: avec et sans bump-mapping.
[vertex_shader]
[fragment_shader]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 #version 120 // Matrix. uniform mat4 model_view; uniform mat4 projection; uniform mat4 light_matrix; // Input: direction de la lumiere. uniform vec3 lightDir; // Output pour le fragment. varying vec2 fragment_texcoord; varying vec3 texture_light; varying vec3 texture_eye; void main(void) { // Calculer la nouvelle position. gl_Position = projection * model_view * gl_Vertex; // Calculer les vecteurs de la matrice TBN. vec3 t = (model_view*vec4(1.0, 0.0, 0.0, 0.0)).xyz; vec3 n = (model_view*vec4(gl_Normal, 0.0)).xyz; vec3 b = cross(n, t); mat3 matrice_tbn = mat3(t, b, n); // Normaliser le vecteur lumiere. //vec3 light = normalize(vec4(-lightDir, 0.0)).xyz; vec3 light = normalize( light_matrix * vec4(-lightDir, 0.0)).xyz; // Calculer les composantes de texture_light dans l'espace TBN. texture_light = matrice_tbn * light; vec3 eye = (model_view*gl_Vertex).xyz; eye = normalize(-eye); // Calculer texture_eye dans l'espace TBN. texture_eye = matrice_tbn * eye; // Fournir au fragment les coordonnées de texture. fragment_texcoord = gl_MultiTexCoord0.st; }
[Lien]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #version 120 // Textures. uniform sampler2D base_texture; uniform sampler2D normal_map; // Input du fragment. varying vec2 fragment_texcoord; varying vec3 texture_light; varying vec3 texture_eye; void main(void) { float diffuse_intensity; float specular_intensity; vec3 light, normal, eye, reflection; vec4 fragColor; // Obtenir la normal via la normal_map. normal = normalize( texture2D(normal_map, fragment_texcoord).xyz * 2.0 - 1.0 ); normal.y *= -1; // Les normal-map sont générée pour DX, donc il faut adapter. light = normalize(texture_light); eye = normalize(texture_eye); // Calculer l'intensité de la couleur diffuse, reflection, et specular. diffuse_intensity = clamp(max(dot(normal, light), 0.0), 0.0, 1.0); reflection = normalize(reflect(-light, normal)); specular_intensity = pow(clamp(max(dot(reflection, eye), 0.0), 0.0, 1.0), 0.0 ); // Calculer la couleur finale. fragColor = 2 * vec4(0.0, 0.0, 0.0, 1.0); fragColor += texture2D(base_texture, fragment_texcoord)*diffuse_intensity; fragColor += vec4(0.0, 0.0, 0.0, 1.0) * specular_intensity; // Positionner la couleur. gl_FragColor = fragColor; }
Avec Bump-Mapping: Lien
Sans Bump-Mapping: Lien
J'espère que quelqu'un pourra me dire ce qui cloche! :-)







Répondre avec citation








Partager