Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS上的GLD组件VAO/VBO崩溃_Iphone_Ios_Opengl Es_3d_Opengl Es 2.0 - Fatal编程技术网

Iphone iOS上的GLD组件VAO/VBO崩溃

Iphone iOS上的GLD组件VAO/VBO崩溃,iphone,ios,opengl-es,3d,opengl-es-2.0,Iphone,Ios,Opengl Es,3d,Opengl Es 2.0,我正在创建一个批处理类,该类使用VAOs和VBOs来管理网格。但是,当尝试使用GLDraweElements时,当绑定回VAO时,我会获得EXEC_BAD_访问权限和GL_INVALID_操作。代码如下: glGenVertexArraysOES(1, &arrayID); glBindVertexArrayOES(arrayID); // Bind INTO VAO, opening state // Load shaders and textures and bi

我正在创建一个批处理类,该类使用VAOs和VBOs来管理网格。但是,当尝试使用GLDraweElements时,当绑定回VAO时,我会获得EXEC_BAD_访问权限和GL_INVALID_操作。代码如下:

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元素数组缓冲区VBO时收到EXEC\u BAD\u访问权限吗?

你确定以下语句是真的吗

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

@Martins Mozeiko——是的,我一直跟踪glGetError,直到EXEC\u BAD\u访问,glDrawArrays在SIG中止之前设置了GL\u INVALID\u操作。kStride为12(3垂直,3标准,4色,2 texuv)。后面的部分是正确的,如果不是,指针替换不太可能起作用(原始文章的最后部分)。谢谢你的理智检查!我不知道调用
glBindVertexArrayOES(0)
会保存任何状态。。。你确定吗?我的理解是,在调用
glvertexattributepointer
时会发生保存,对于
GL\u数组\u缓冲区
,在调用
glBufferData
时会发生保存,对于
GL\u元素\u数组\u缓冲区
。请参阅本教程:我重写了渲染管道的一大部分,但实际上无法说出我找到了什么(如果有的话)解决方案。很抱歉