2016-12-28 78 views
1

创建我的缓冲区下面的代码:glDrawElements不拉丝

//generate buffers 
glGenVertexArrays(1, &VAO); 
//glGenBuffers(1, &EBO); 
glGenBuffers(1, &VBO_vertices); 
glGenBuffers(1, &VBO_colors); 
glGenBuffers(1, &VBO_normals); 

// Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s). 
glBindVertexArray(VAO); 

// Copy our vertices array in a buffer for OpenGL to use 
glBindBuffer(GL_ARRAY_BUFFER, VBO_vertices); 
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*vertices.size(), &vertices[0], GL_STATIC_DRAW); 


glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vTable.size() * sizeof(int), &vTable[0], GL_STATIC_DRAW); 

// Position attribute 
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); //size = 3 (X,Y,Z) 
glEnableVertexAttribArray(0); 


//Buffer for color 
glBindBuffer(GL_ARRAY_BUFFER, VBO_colors); 
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*vertices.size(), &v_color[0], GL_STATIC_DRAW); 

// Color attribute 
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); //size = 3 (R,G,B) 
glEnableVertexAttribArray(1); 


//Buffer for normals 
glBindBuffer(GL_ARRAY_BUFFER, VBO_normals); 
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*vertices.size(), &v_normals[0], GL_STATIC_DRAW); 

//normal attribute 
glVertexAttribPointer((GLuint)2, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0); //size = 3 (R,G,B) 
glEnableVertexAttribArray(2); 


// Unbind the VAO 
glBindVertexArray(0); 

我的数据是:

vector<vec3> vertices, v_normals,v_color; 
vector<int> vTable; 

我有顶点,法线和每顶点颜色和索引表与索引顶点每个三角形。

当我尝试渲染这个时,窗口上没有任何东西出现。

glBindVertexArray(VAO); //Bind VAO 
glDrawElements(GL_TRIANGLES, vTable.size(), GL_UNSIGNED_INT, &vTable[0]); 
glBindVertexArray(0); //Unbind VAO 

如果我用这个:

glDrawArrays(GL_TRIANGLES,0,vTable.size()); 

它借鉴的东西,但一个不完整的对象,如链接形象。

image

任何人知道会发生什么?在此先感谢

+0

'glDrawElements'的最后一个参数是索引缓冲区中的偏移量。所以你应该传递一个空指针。 –

回答

2

glDrawElements电话是错的,最后一个参数应该是一个字节偏移到您GL_ELEMENT_ARRAY_BUFFER持有的指数,而不是指向的系统内存。

glDrawElements(GL_TRIANGLES, vTable.size(), GL_UNSIGNED_INT, 0); 
+0

这是真的!谢谢 – ladymac