Por que chamar glMatrixMode (GL_PROJECTION) dá-me EXC_BAD_ACCESS em um aplicativo do iPhone?

StackOverflow https://stackoverflow.com/questions/260391

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tenho um iPhone app onde eu chamo essas três funções em appDidFinishLaunching:

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

Quando percorrendo com o depurador eu recebo EXC BAD ACCESS quando eu executar a primeira linha. Alguma idéia por que isso está acontecendo?

Btw eu tenho outra aplicação onde eu faço a mesma coisa e ele funciona muito bem. Então, eu tentei tudo duplicado nesse aplicativo (#imports, acrescentando quadro OpenGLES, etc), mas agora eu só estou preso.

Foi útil?

Solução

Eu tenho que correr para isso com as chamadas OpenGL se dois tópicos estão tentando desenhar a cena OpenGL ao mesmo tempo. No entanto, isso não soa como o que você está fazendo.

Você inicializado corretamente seu contexto de apresentação e framebuffer antes que esta chamada? Por exemplo, no meu subclasse UIView que faz desenho OpenGL, eu chamo o seguinte em seu initWithCoder: método:

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

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

O método createFramebuffer parece com o seguinte:

- (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;
}

Isso é muito bonito código clichê, como gerado pelo modelo de OpenGL ES Aplicação no XCode. Talvez por não inicializar as coisas antes de chamar glMatrixMode (), você está recebendo um acidente.

Além disso, por que você está fazendo OpenGL desenho em applicationDidFinishLaunching :? Não seria um controlador ou vista ser um lugar mais apropriado para OpenGL chama do que o seu UIApplicationDelegate?

Outras dicas

Não deve ser o problema, dada a data em que você enviou o bug, mas você também veria algo assim, se você usar o código de exemplo Apple e funciona em um dispositivo capaz ES 2.0, uma vez que elimina a pilha de matriz de a especificação, embora as definições de função permanecerá visível para o compilador desde que o dispositivo também suporta ES 1.1.

Eu já vi esse erro em muitas situações diferentes, mas nunca especificamente na sua. Ele geralmente vem como um resultado da aplicação tentando memória de acesso que já foi liberado.

Você pode confirmar que rect ainda está alocado?

É necessário substituir a matriz atual com a matriz de identidade antes de chamar glOrthof. Isso pode ser feito com glLoadIdentity ()

Reinicie o iPhone Simulator. Esta questão é definitivamente devido ao contexto OpenGL não ser ajustado adequadamente. Descobri que às vezes o iPhone Simulator tem problemas e precisa ser reiniciado para o contexto OpenGL para se ajustar adequadamente por [EAGLContext setCurrentContext:].

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top