2016-01-22 55 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