2012-02-10 5 views
0

Je crée par défaut VAO et un VBO, et les lier. Je chargement des données de modèle au tableau de struct vertex_data_tcomportement bizarre de glVertexAttribPointer

glBufferData(GL_ARRAY_BUFFER, nvertices * sizeof(vertex_data_t), vertices, GL_STATIC_DRAW); 

Puis, en fonction de tirage que je fais:

glBindVertexArray(vao); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_data_t), (const GLvoid *)offsetof(vertex_data_t, position)); 
    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, sizeof(vertex_data_t), (const GLvoid *)offsetof(vertex_data_t, position)); 
    glBindVertexArray(0); 
    glDrawArrays(GL_TRIANGLES, 0, nvertices); 

Je reçois agréable, ombragé Suzanne:

http://i.stack.imgur.com/uRjpv.png

Cependant, c'est faux! Dernier argument de glVertexAttribPointer pour l'attribut normal devrait être 12 aka (const GLvoid *) offsetof (vertex_data_t, normal), mais quand je fais ma Suzanne est brisée:

http://i.stack.imgur.com/zBjTS.png

Comment est-il possible? Comment shader connaît-il un décalage par rapport à la normale?

Vertex shader:

 attribute vec3 vertex; 
    attribute vec3 normal; 

    uniform vec4 ambient_color; 
    uniform vec4 diffuse_color; 
    uniform vec3 light_position; 
    uniform mat3 normal_matrix; 
    uniform mat4 model_view_matrix; 
    uniform mat4 model_view_projection_matrix; 

    varying vec4 varying_color; 

    void main(void) { 
       vec4 vertex4 = vec4(vertex.x, vertex.y, vertex.z, 1.0); 
       vec3 eye_normal = normal_matrix * normal; 
       vec4 position4 = model_view_matrix * vertex4; 
       vec3 position3 = position4.xyz/position4.w; 
       vec3 light_direction = normalize(light_position - position3); 
       float diffuse = max(0.0, dot(eye_normal, light_direction)); 
       varying_color.rgb = diffuse * diffuse_color.rgb; 
       varying_color.a = diffuse_color.a; 
       varying_color += ambient_color; 
       gl_Position = model_view_projection_matrix * vertex4; 
    } 
+0

définition vertex_data_t est à: [https://raw.github.com/jacekmigacz/cobj/master /wavefront.h](https://raw.github.com/jacekmigacz/cobj/master/wavefront.h) – jacekmigacz

+0

Est-ce que cela vous dérange également de publier le shader? Vous devriez utiliser 'glBindAttribLocation' et' glGetAttribLocation' à un moment donné, pouvez-vous poster cela aussi? – tibur

+0

code de vertex shader ajouté. tout ce que fait le fragment shader est gl_FragColor = changing_color; – jacekmigacz

Répondre

1

Je pense que vous manquez quelque chose comme:

glBindAttribLocation(progId, 0, "vertex"); 
glBindAttribLocation(progId, 1, "normal"); 
+0

C'est ça! J'apprends de Super Bible 5ème édition. Cette partie est déroutante ... Ce GLTools merdique cache les parties les plus importantes. – jacekmigacz