Ios7 在OpenGL ES 3.0上使用VBO抛出EXC_BAD_访问的GLD元素

Ios7 在OpenGL ES 3.0上使用VBO抛出EXC_BAD_访问的GLD元素,ios7,exc-bad-access,vbo,opengl-es-3.0,Ios7,Exc Bad Access,Vbo,Opengl Es 3.0,这个问题快把我逼疯了,因为它似乎是对的。我正在使用iOS7和OpenGLES3.0 变量的类型为: float vertices[24]; unsigned short indices[24]; unsigned char colors[32]; unsigned int vboIds[3]; 这只执行一次: vertices[0] = -0.5f; vertices[1] = -0.5f; vertices[2] = 0.5f; vertices[3] = 0.5f; vertices[4]

这个问题快把我逼疯了,因为它似乎是对的。我正在使用iOS7和OpenGLES3.0

变量的类型为:

float vertices[24];
unsigned short indices[24];
unsigned char colors[32];
unsigned int vboIds[3];
这只执行一次:

vertices[0] = -0.5f; vertices[1] = -0.5f; vertices[2] = 0.5f;
vertices[3] = 0.5f; vertices[4] = -0.5f; vertices[5] = 0.5f;
vertices[6] = 0.5f; vertices[7] = 0.5f; vertices[8] = 0.5f;
vertices[9] = -0.5f; vertices[10] = 0.5f; vertices[11] = 0.5f;
vertices[12] = -0.5f; vertices[13] = -0.5f; vertices[14] = -0.5f;
vertices[15] = 0.5f; vertices[16] = -0.5f; vertices[17] = -0.5f;
vertices[18] = 0.5f; vertices[19] = 0.5f; vertices[20] = -0.5f;
vertices[21] = -0.5f; vertices[22] = 0.5f; vertices[23] = -0.5f;

indices[0] = 0; indices[1] = 1; // front
indices[2] = 1; indices[3] = 2;
indices[4] = 2; indices[5] = 3;
indices[6] = 3; indices[7] = 0;

indices[8] = 4; indices[9] = 5; // back
indices[10] = 5; indices[11] = 6;
indices[12] = 6; indices[13] = 7;
indices[14] = 7; indices[15] = 4;

indices[16] = 0; indices[17] = 4; // sides
indices[18] = 1; indices[19] = 5;
indices[20] = 2; indices[21] = 6;
indices[22] = 3; indices[23] = 7;

for (size_t i = 0;i<8;++i) {
    colors[i*4+0] = (unsigned char)((vertices[i*3+0]+0.5)*255);
    colors[i*4+1] = (unsigned char)((vertices[i*3+1]+0.5)*255);
    colors[i*4+2] = (unsigned char)((vertices[i*3+2]+0.5)*255);
    colors[i*4+3] = 255;
}

GL(glGenBuffers(3, vboIds));

GL(glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]));
GL(glBufferData(GL_ARRAY_BUFFER, sizeof(float)*24, vertices, GL_STATIC_DRAW));

GL(glBindBuffer(GL_ARRAY_BUFFER, vboIds[1]));
GL(glBufferData(GL_ARRAY_BUFFER, sizeof(char)*32, colors, GL_STATIC_DRAW));

GL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[2]));
GL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(short)*24, indices, GL_STATIC_DRAW));

GLDraweElements(…)正在抛出一个EXC_BAD_访问(代码=1,地址=0x0),我不知道原因。

我通过放置:

GL(glGenBuffers(3, vboIds));

GL(glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]));
GL(glBufferData(GL_ARRAY_BUFFER, sizeof(float)*24, vertices, GL_STATIC_DRAW));

GL(glBindBuffer(GL_ARRAY_BUFFER, vboIds[1]));
GL(glBufferData(GL_ARRAY_BUFFER, sizeof(char)*32, colors, GL_STATIC_DRAW));

GL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[2]));
GL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(short)*24, indices, GL_STATIC_DRAW));

在InitGL方法中,而不是在构造函数中。

因为我看不到任何错误,所以我尝试了代码。我懒得创建iOS项目,但我把它放到了Mac上的一个GLUT应用程序中。它没有崩溃,它呈现了一个正方形,这是我所期望的,因为我没有应用任何变换。所以要么iOS上有一些不同的东西,要么代码中有一些我们在这里没有看到的东西。一个建议:我将使用GL定义的顶点数据类型,如GLushort、GLuchar、GLfloat等。不能保证GLushort和unsigned short在每个平台上都是相同的类型。我认为它们是在iOS上。我刚刚尝试将数据类型更改为OpenGL,但它抛出了相同的错误。如果您在构造函数中有代码,则您的对象可能在创建上下文和当前上下文之前实例化。在编写封装GL对象的C++类时,我总是使用init类型方法来创建GL对象。如果这是在构造函数中完成的,那么很容易在上下文准备就绪之前意外创建对象。
GL(glGenBuffers(3, vboIds));

GL(glBindBuffer(GL_ARRAY_BUFFER, vboIds[0]));
GL(glBufferData(GL_ARRAY_BUFFER, sizeof(float)*24, vertices, GL_STATIC_DRAW));

GL(glBindBuffer(GL_ARRAY_BUFFER, vboIds[1]));
GL(glBufferData(GL_ARRAY_BUFFER, sizeof(char)*32, colors, GL_STATIC_DRAW));

GL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIds[2]));
GL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(short)*24, indices, GL_STATIC_DRAW));