2012-02-10 48 views
0

我创建默认的VAO和一个VBO,并绑定它们。 我加载模型数据结构的阵列vertex_data_tglVertexAttribPointer的怪异行为

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又名(常量GLvoid *)offsetof(vertex_data_t,正常),但是当我这样做我的苏珊被打破:

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

vertex_data_t的定义是:https://raw.github.com/jacekmigacz/cobj/master /wavefront.h](https://raw.github.com/jacekmigacz/cobj/master/wavefront.h) – jacekmigacz 2012-02-10 12:05:09

+0

你还介意着色器吗?你应该在某个时候使用'glBindAttribLocation'和'glGetAttribLocation',你可以发布吗? – tibur 2012-02-10 12:55:36

+0

附加的顶点着色器代码。所有片段着色器正在做的是gl_FragColor = varying_color; – jacekmigacz 2012-02-10 13:01:00

回答

1

我想你好想是这样的:

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

这就是它!我从超级圣经第5版中学习。这部分令人困惑......那些蹩脚的GLTools隐藏了最重要的部分。 – jacekmigacz 2012-02-10 21:28:38