2012-02-10 7 views
0

저는 기본 VAO와 하나의 VBO를 만들고 바인딩합니다. 나는 그런 그리기 기능에glVertexAttribPointer의 이상한 행동

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

vertex_data_t 구조체의 배열에 모델 데이터를로드하고있어 내가 할 :

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) 일명 내가 그렇게 할 때 (vertex_data_t, 일반)을 offsetof (const를 GLvoid *),하지만 내 수잔이 분류됩니다

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

: [https://raw.github.com/jacekmigacz/cobj/master /wavefront.h](https://raw.github.com/jacekmigacz/cobj/master/wavefront.h) – jacekmigacz

+0

셰이더를 게시 하시겠습니까? 당신은 어떤 시점에서'glBindAttribLocation'과'glGetAttribLocation'을 사용해야합니다, 당신은 그것을 게시 할 수 있습니까? – tibur

+0

첨부 된 버텍스 쉐이더 코드. 셰이더 조각이하는 일은 gl_FragColor = varying_color입니다. – jacekmigacz

답변

1

난 당신이 뭔가를 그리워 생각 :

vertex_data_t의 정의에 있습니다
glBindAttribLocation(progId, 0, "vertex"); 
glBindAttribLocation(progId, 1, "normal"); 
+0

이것은 그 것이다! 저는 슈퍼 성경 5 판에서 배웠습니다. 이 부분은 혼란 스럽습니다 ... 그 진절머리 나는 GLTools는 가장 중요한 부분을 숨 깁니다. – jacekmigacz