2016-01-22 66 views
0

我以下面的方式初始化我的VBO/VAO状态,我想知道这是否是正确的顺序,因为glDrawElements()给我一个SIGSEGV。据我所知,顶点数据和索引数据缓冲区绑定到TE本期界VAO:在OpenGL 3.x的VBO索引

glGenVertexArrays(1, (GLuint*)&vaoId); // make VAO 
glGenBuffers(2, (GLuint*)&vboIds); // make data and idx buffers 

glBindVertexArray(vaoId); 
glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]); 
glBufferData(GL_ARRAY_BUFFER, mumVertices * strideBytes, NULL, static_cast<GLenum>(usagePattern)); // numVertices == 4 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[1]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numElements * sizeof(cx_uint_t), NULL, static_cast<GLenum>(usagePattern)); // numElements == 6 

然后,从代码中的另一个点缓冲区数据初始化:

glBindVertexArray(vaoId); 
glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[1]); 

currentDataBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); 
currentElemBuffer = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY); 

// setup vertex data in 'currentDataBuffer' (coords, color): 
// vert1: -100.0f,-100.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f 
// vert2: 100.0f,-100.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f 
// vert3: 100.0f, 100.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f 
// vert4: -100.0f, 100.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f 

// setup element data in 'currentElemBuffer': 
// 0, 1, 3, 1, 2, 3 

// shader attribs setup 
glEnableVertexAttribArray(getAttribName("vert")); 
glVertexAttribPointer(getAttribName("vert"), 3, GL_FLOAT, false, 7 * sizeof(cx_float_t), NULL); 
glEnableVertexAttribArray(getAttribName("color")); 
glVertexAttribPointer(getAttribName("color"), 4, GL_FLOAT, false, 7 * sizeof(cx_float_t), (cx_genptr_t)(3 * sizeof(cx_float_t))); 

glUnmapBuffer(GL_ARRAY_BUFFER); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

glBindVertexArray(0); 

现在的渲染部分:

glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

glBindVertexArray(vaoId); 
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL); 
glBindVertexArray(0); 

glPopAttrib(); 

我真的很感谢一些帮助,在此先感谢。

回答

0

假设GL_ELEMENT_ARRAY_BUFFER绑定绑定到VAO,您是正确的。这正是你的问题。望着你的缓冲区初始化代码末尾:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

glBindVertexArray(0); 

在这里,我们解除绑定GL_ELEMENT_ARRAY_BUFFER而VAO仍难免。这意味着在VAO中跟踪的当前绑定变为0

然后,当您绑定VAO渲染:

glBindVertexArray(vaoId); 

你没有绑定的索引缓存。

要解决这个问题,只需在缓冲区初始化代码结束时删除解除GL_ELEMENT_ARRAY_BUFFER的调用即可。

+0

非常感谢!经过一些调整,我发现了它;) – NapardBlose