저는 기본 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;
}
: [https://raw.github.com/jacekmigacz/cobj/master /wavefront.h](https://raw.github.com/jacekmigacz/cobj/master/wavefront.h) – jacekmigacz
셰이더를 게시 하시겠습니까? 당신은 어떤 시점에서'glBindAttribLocation'과'glGetAttribLocation'을 사용해야합니다, 당신은 그것을 게시 할 수 있습니까? – tibur
첨부 된 버텍스 쉐이더 코드. 셰이더 조각이하는 일은 gl_FragColor = varying_color입니다. – jacekmigacz