exc_bad_access при использовании VBO в Cocos2d - PullRequest
3 голосов
/ 22 апреля 2011

В моем приложении для iPhone я создаю буфер вершин, как показано ниже:

-(id)initWithPoints:(NSArray *)polygonPoints andTexture: (CCTexture2D *) fillTexture{
self = [super init];
if(self){      
    int vertexCount = [polygonPoints count];
    CGPoint *vertices = (CGPoint*)malloc(sizeof(CGPoint)*vertexCount);
    GLushort *indices = (GLushort*)malloc(sizeof(GLushort)*2*vertexCount);

    int i = 0;
    for(NSValue *value in polygonPoints){
        CGPoint p = [value CGPointValue];
        vertices[i] = ccp(p.x, p.y);
        i++;
    }
    for (int k = 0; k<vertexCount; k++) {
        indices[k] = (GLushort)k;
    }

    NSLog(@"count: %i", vertexCount);
    glGenBuffers(1, &vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, vertexCount*sizeof(CGPoint), &vertices[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);


    glGenBuffers(1, &indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, (vertexCount)*2*sizeof(GLushort), &indices[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    self.text = fillTexture;
}

return self;

}

И я рисую, используя:

-(void)draw{
glBindTexture(GL_TEXTURE_2D, self.text.name);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);    
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);

glVertexPointer(2, GL_FLOAT, sizeof(CGPoint), 0);
glEnableClientState(GL_VERTEX_ARRAY);    

glDrawElements(GL_TRIANGLES, 1024, GL_UNSIGNED_SHORT, 0);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

}

Однако я могу вызывать glDrawElements только с 1024 элементами (из ~ 20 000), и они отображаются нормально. Если я установлю его (например) 1025, приложение аварийно завершится с EXC_BAD_ACCESS.

Очевидно, что причина сбоя приложения в 1024 элементах, но я не могу понять, что это такое. Любые идеи будут высоко оценены!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...