OpenGL 中的 VBO 索引 3.x
VBO indexing in OpenGL 3.x
我正在按以下方式初始化我的 VBO/VAO 状态,我想知道这是否是正确的顺序,因为 glDrawElements() 给我一个 SIGSEGV。据我所知,顶点数据和索引数据缓冲区与当前绑定的 VAO 相关联:
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
然后,在代码中从另外一点初始化buffer数据:
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();
在此先感谢您的帮助。
您假设 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
的调用即可。
我正在按以下方式初始化我的 VBO/VAO 状态,我想知道这是否是正确的顺序,因为 glDrawElements() 给我一个 SIGSEGV。据我所知,顶点数据和索引数据缓冲区与当前绑定的 VAO 相关联:
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
然后,在代码中从另外一点初始化buffer数据:
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();
在此先感谢您的帮助。
您假设 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
的调用即可。