【问题标题】:glDrawElements VAO/VBO crash on iOSiOS 上的 glDrawElements VAO/VBO 崩溃
【发布时间】:2012-03-22 15:02:33
【问题描述】:

我正在创建一个使用 VAO 和 VBO 来管理网格的批处理类。但是,当尝试使用 glDrawElements 时,我会在绑定回我的 VAO 时得到 EXEC_BAD_ACCESS 和 GL_INVALID_OPERATION。代码如下:

glGenVertexArraysOES(1, &arrayID);      
glBindVertexArrayOES(arrayID);    // Bind INTO VAO, opening state

// Load shaders and textures and bind them using glUseProgram etc.

glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glGenBuffers(1, &indexID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexID); 
glBindVertexArrayOES(0);    // Bind AWAY from VAO, saving state

Glfloat data[length];

glBindVertexArrayOES(arrayID);    // Bind INTO VAO, open state

unsigned int glfloatsize = sizeof(GLfloat);
unsigned int stride = kStride * glfloatsize;

// Fill Vertex information
glBufferData(GL_ARRAY_BUFFER, vertCount * glfloatsize * kStride, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, vertCount * glfloatsize * kStride, data);   

glEnableVertexAttribArray(kPositionLocation);
glVertexAttribPointer(kPositionLocation, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(0));

glEnableVertexAttribArray(kNormalLocation);
glVertexAttribPointer(kNormalLocation, 3, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(3));

glEnableVertexAttribArray(kColorLocation);
glVertexAttribPointer(kColorLocation, 4, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(6));

glClientActiveTexture(GL_TEXTURE0);
glEnableVertexAttribArray(kTextureLocation);
glVertexAttribPointer(kTextureLocation, 2, GL_FLOAT, GL_FALSE, stride, BUFFER_OFFSET(10));

// Fill Index information
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * sizeof(GLushort), NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexCount * sizeof(GLushort), index);

glBindVertexArrayOES(0);    // Bind AWAY from VAO, saving state

// DO OTHER STUFF

/** RENDER (EXPLODES WITH EXEC_BAD_ACCESS) **/
glBindVertexArrayOES(arrayID);
glDrawElements(renderMode, indexCount, GL_UNSIGNED_SHORT, 0);
glBindVertexArrayOES(0);

/** RENDER (WORKS CORRECTLY [index is a scoped array of GLushorts that are uploaded to the VBO above...]) **/
glBindVertexArrayOES(arrayID);
glDrawElements(renderMode, indexCount, GL_UNSIGNED_SHORT, index);
glBindVertexArrayOES(0);

知道为什么我在尝试使用 GL_ELEMENT_ARRAY_BUFFER VBO 时收到 EXEC_BAD_ACCESS 吗?

【问题讨论】:

  • 我不知道调用glBindVertexArrayOES(0) 会保存任何状态...你确定吗?我的理解是,对于GL_ARRAY_BUFFER,调用glVertexAttribPointer 时会发生保存,对于GL_ELEMENT_ARRAY_BUFFER,它会在调用glBufferData 时发生。请参阅本教程:arcsynthesis.org/gltut/Positioning/Tutorial%2005.html
  • 我重写了我的渲染管道的很大一部分,但不能真正说出我找到了什么(如果有的话)解决方案。对不起!

标签: iphone ios opengl-es 3d opengl-es-2.0


【解决方案1】:

您确定以下陈述是正确的吗?

  • 所有 OpenGL 函数均未设置错误 - 在每个 glXYZ 函数后调用 glGetError 并检查结果。
  • kStride >= 24
  • 长度 == vertCount * kStride
  • 索引数组包含 GLushort 类型的 indexCount 元素
  • 索引数组的所有元素的值都小于 vertCount 值
  • 没有其他 glEnableVertexAttribArray 调用

【讨论】:

  • @Martins Mozeiko -- 是的,我一直跟踪 glGetError 直到 EXEC_BAD_ACCESS,glDrawArrays 在 sigaborting 之前设置 GL_INVALID_OPERATION。 kStride 为 12(3 vert,3 norm,4 color,2 texuv)。后面的部分是正确的,如果不是,则指针替换不太可能起作用(原始帖子的最后一部分)。感谢您的健全性检查!
猜你喜欢
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多