2013-11-14 36 views
3

我有一個關於交織的vbo的問題。我有一個看起來像這樣交錯VBO與COORDS,法線和顏色

struct VertexData{ 
    float x,y,z; //vertex coordinates 
    float normalx,normaly,normalz; //vertex normal 
    float cx,cy,cz; //vertex color 
}; 

的結構,並且這是我創造我的VBO,VAO,IBO:

//creat OpenGL objects to use in drawing 
    unsigned int gl_vertex_array_object, gl_vertex_buffer_object, gl_index_buffer_object; 

    //vertex array object 
    glGenVertexArrays(1, &gl_vertex_array_object); 
    glBindVertexArray(gl_vertex_array_object); 

    //vertex buffer object -> we hold the vertices 
    glGenBuffers(1,&gl_vertex_buffer_object); 
    glBindBuffer(GL_ARRAY_BUFFER, gl_vertex_buffer_object); 
    glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(VertexData), &vertices[0], GL_STATIC_DRAW); 


    //index buffer object -> we hold the index of vertex 
    glGenBuffers(1,&gl_index_buffer_object); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gl_index_buffer_object); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(unsigned int), &indices[0], GL_STATIC_DRAW); 

    //the connection between attributes, interleaved data 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(VertexData),(void*)0);      //send positions on pipe 0 
    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,sizeof(VertexData),(void*)(sizeof(float)*3));  //send normals on pipe 1 
    glEnableVertexAttribArray(2); 
    glVertexAttribPointer(2,3,GL_FLOAT,GL_FALSE,sizeof(VertexData),(void*)(3*sizeof(float)*3));  //send colors on pipe 2 

    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 
    glNormalPointer(GL_FLOAT,sizeof(VertexData),(void*)(sizeof(float)*3)); 
    glColorPointer(3,GL_FLOAT,sizeof(VertexData),(void*)(3*sizeof(float)*3)); 

    vao = gl_vertex_array_object; 
    vbo = gl_vertex_buffer_object; 
    ibo = gl_index_buffer_object; 
    num_indices = indices.size(); 

如果我的VBO是VertexData的載體,它意味着它是交錯?我發送的數據是否正確?與步幅和抵消? 所有這些都在另一個班。這裏是我如何加載網格,並在主類中繪製它

//load 
teren::loadTerrain("resurse\\heightmap.bmp","resurse\\heightmap_color.bmp",mesh_vao_ground, mesh_vbo_ground, mesh_ibo_ground, mesh_num_indices_ground,20); 
    //draw 
    glUniformMatrix4fv(glGetUniformLocation(gl_program_shader_curent, "model_matrix"),1,false,glm::value_ptr(matrice_translatie)); 
    glBindVertexArray(mesh_vao_ground); 
    glDrawElements(GL_TRIANGLES, mesh_num_indices_ground, GL_UNSIGNED_INT, 0); 

我的地形繪製,但它有一個奇怪的着色。它有粉紅色和藍色,而且看起來不像從我得到我的頂點顏色的彩色圖像。這裏是我的gourard頂點着色器:

layout(location = 0) in vec3 in_position;  
layout(location = 1) in vec3 in_normal; 
layout(location = 2) in vec3 in_color; 

uniform mat4 model_matrix, view_matrix, projection_matrix; 
uniform vec3 light_position; 
uniform vec3 eye_position; 
uniform int material_shininess; 
uniform float material_kd; 
uniform float material_ks; 

out vec3 light; 
void main(){ 


gl_Position = projection_matrix*view_matrix*model_matrix*vec4(in_position,1.0); 
float fDiffuseIntensity = material_kd * max(0.0, dot(normalize(in_normal), normalize(light_position))); 
light = material_ks * in_color * fDiffuseIntensity; 
} 

而且我gourard片段着色器:

in vec3 light; 
out vec4 out_color; 

void main() 
{ 
    out_color = vec4(light,1.0); 
} 

我真的堅持現在。這是我的着色器或我的vbo /屬性等的問題,或者甚至兩者。 (PS:如果在頂點着色器中我改變爲light = in_color,那麼一切都是白色的)。我也有一個在地形上方旋轉的光源。這裏是正在發生的事情的照片: http://i44.tinypic.com/69j0cg.jpg

回答