странное поведение glVertexAttribPointer

Я создаю VAO по умолчанию и один VBO и связываю их. Я загружаю данные модели в массив структур vertex_data_t

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

Затем в функции рисования я делаю:

    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);

Я становлюсь красивой, затушеванная Сюзанна:

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

Однако это неправильно! Последний аргумент glVertexAttribPointer для нормального атрибута должен быть 12 aka (const GLvoid *) offsetof (vertex_data_t, normal), но когда я это делаю, моя Сюзанна сломана:

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

Как это возможно? Как шейдер узнает смещение относительно нормали?

Вершинный шейдер:

     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;
    }

person jacekmigacz    schedule 10.02.2012    source источник
comment
определение vertex_data_t находится по адресу: https://raw.github.com/jacekmigacz/cobj/master/wavefront.h   -  person jacekmigacz    schedule 10.02.2012
comment
Не могли бы вы выложить и шейдер? Вы должны использовать glBindAttribLocation и glGetAttribLocation в какой-то момент, вы можете опубликовать это тоже?   -  person tibur    schedule 10.02.2012
comment
добавлен код вершинного шейдера. все, что делает фрагментный шейдер, - это gl_FragColor = variable_color;   -  person jacekmigacz    schedule 10.02.2012
comment
glBindVertexArray(0); ‹- почему то? glVertexAttribPointer изменяет состояние текущего VAO, поэтому я думаю, что вам не следует отвязывать свой   -  person Kos    schedule 10.02.2012
comment
с glBindVertexArray (0) и без него он отображает то же представление   -  person jacekmigacz    schedule 10.02.2012
comment
Можете ли вы опубликовать код рендеринга там, где он не работает (или, скорее, где он не работает более эффектно)?   -  person Nicol Bolas    schedule 10.02.2012


Ответы (1)


Я думаю, вы упускаете что-то вроде:

glBindAttribLocation(progId, 0, "vertex");
glBindAttribLocation(progId, 1, "normal");
person tibur    schedule 10.02.2012
comment
Это оно! Я учусь по 5-му изданию Супер Библии. Эта часть сбивает с толку ... Этот дерьмовый GLTools скрывает самые важные части. - person jacekmigacz; 11.02.2012