Почему вызов glMatrixMode (GL_PROJECTION) дает мне EXC_BAD_ACCESS в приложении для iPhone? - PullRequest
5 голосов
/ 04 ноября 2008

У меня есть приложение для iphone, где я вызываю эти три функции в appDidFinishLaunching:

glMatrixMode(GL_PROJECTION);
glOrthof(0, rect.size.width, 0, rect.size.height, -1, 1);
glMatrixMode(GL_MODELVIEW);

При прохождении через отладчик я получаю EXC BAD ACCESS, когда выполняю первую строку. Есть идеи, почему это происходит?

Кстати, у меня есть другое приложение, где я делаю то же самое, и оно работает нормально. Поэтому я попытался продублировать все в этом приложении (#imports, добавление фреймворка OpenGLES и т. Д.), Но сейчас я просто застрял.

Ответы [ 5 ]

4 голосов
/ 05 ноября 2008

Я столкнулся с этим при вызовах OpenGL, если два потока пытаются одновременно нарисовать сцену OpenGL. Однако это не похоже на то, что вы делаете.

Правильно ли вы инициализировали свой контекст отображения и кадровый буфер перед этим вызовом? Например, в моем подклассе UIView, который выполняет рисование OpenGL, я вызываю следующее в его initWithCoder: метод:

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

if (!context || ![EAGLContext setCurrentContext:context] || ![self createFramebuffer]) 
{
    [self release];
    return nil;
}

Метод createFramebuffer выглядит следующим образом:

- (BOOL)createFramebuffer 
{   
    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

    if (USE_DEPTH_BUFFER) {
        glGenRenderbuffersOES(1, &depthRenderbuffer);
        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
    }

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    {
        return NO;
    }

    return YES;
}

Это в значительной степени стандартный код, сгенерированный шаблоном приложения OpenGL ES в XCode. Возможно, не инициализируя вещи перед вызовом glMatrixMode (), вы получаете сбой.

Кроме того, почему вы делаете OpenGL-рисование в ApplicationDidFinishLaunching :? Разве представление или контроллер представления не будут более подходящим местом для вызовов OpenGL, чем ваш UIApplicationDelegate?

3 голосов
/ 04 февраля 2010

Маловероятно, что это проблема, учитывая дату, когда вы отправили ошибку, но вы также увидите что-то подобное, если будете использовать пример кода Apple и работать на устройстве с поддержкой ES 2.0, так как он удаляет стек матрицы из спецификация, хотя определения функций останутся видимыми для компилятора, так как устройство также поддерживает ES 1.1.

2 голосов
/ 04 ноября 2008

Я видел эту ошибку во многих различных ситуациях, но никогда в вашей. Обычно это происходит в результате попытки приложения получить доступ к уже освобожденной памяти.

Можете ли вы подтвердить, что прямоугольник все еще выделен?

1 голос
/ 23 мая 2010

Перезагрузите iPhone Simulator. Эта проблема определенно связана с тем, что контекст OpenGL не установлен должным образом. Я обнаружил, что иногда iPhone Simulator имеет проблемы и его необходимо перезапустить, чтобы контекст OpenGL был правильно настроен с помощью [EAGLContext setCurrentContext:].

1 голос
/ 20 февраля 2009

Перед вызовом glOrthof вам необходимо заменить текущую матрицу на единичную. Это можно сделать с помощью glLoadIdentity ()

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