2008-11-04 12 views
5

que tienen una aplicación para iPhone en el que llamo a estas tres funciones en appDidFinishLaunching:¿Por qué llamar a glMatrixMode (GL_PROJECTION) me da EXC_BAD_ACCESS en una aplicación de iPhone?

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

Cuando paso a paso por el depurador me sale EXC ACCESO BAD cuando ejecuto la primera línea. ¿Alguna idea de por qué está pasando esto?

Btw Tengo otra aplicación donde hago lo mismo y funciona bien. Así que he tratado de duplicar todo en esa aplicación (#importaciones, agregando el framework OpenGLES, etc.) pero ahora estoy atascado.

Respuesta

4

Me he encontrado con esto con llamadas OpenGL si dos hilos están intentando dibujar a la escena OpenGL de una vez. Sin embargo, eso no suena como lo que estás haciendo.

¿Ha inicializado correctamente el contexto de visualización y el framebuffer antes de esta llamada? Por ejemplo, en mi subclase UIView que hace el dibujo OpenGL, llamo al siguiente en su initWithCoder: Método:

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

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

El método createFramebuffer tiene el siguiente aspecto:

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

Esto es más o menos código repetitivo , según lo generado por la plantilla de la aplicación OpenGL ES en XCode. Quizás al no inicializar las cosas antes de llamar a glMatrixMode(), se produce un bloqueo.

Además, ¿por qué está haciendo dibujo OpenGL en applicationDidFinishLaunching :? ¿No sería una vista o vista el controlador un lugar más apropiado para las llamadas OpenGL que su UIApplicationDelegate?

+0

Puede ser porque la aplicación de demostración de Apple, CrashLanding lo hace de esa manera. – xyz

2

He visto este error en muchas situaciones diferentes, pero nunca específicamente en la tuya. Suele aparecer como resultado de la aplicación que intenta acceder a la memoria que ya se ha liberado.

¿Se puede confirmar que se sigue asignando rect?

1

Debe reemplazar la matriz actual con la matriz de identidad antes de llamar a glOrthof. Esto se puede hacer con glLoadIdentity()

3

No es probable que sea el problema dada la fecha en que envió el error, pero también vería algo como esto si usa el código de ejemplo de Apple y ejecuta un ES 2.0 capaz dispositivo, ya que elimina la pila de matriz de la especificación, aunque las definiciones de función seguirán siendo visibles para el compilador ya que el dispositivo también es compatible con ES 1.1.

+0

El proyecto predeterminado de OpenGL intenta cargar ES 2.0 primero, y solo 1.1 si eso falla. Puede solucionar esto editando 'awakeFromNib'. – tsellon

1

Reinicie el simulador de iPhone. Este problema definitivamente se debe a que el contexto de OpenGL no se ha configurado correctamente. Descubrí que a veces el simulador de iPhone tiene problemas y necesita reiniciarse para que el contexto de OpenGL se configure correctamente por [EAGLContext setCurrentContext:].

+3

También recibía este error y no podía entender por qué. Encontré esta página a través de google. Luego eché un vistazo más de cerca a mi código y me di cuenta de que estaba inicializando el contexto con ES 2.0, pero usando mi renderizador ES 1.1 para mostrar. Oops. – Christine

Cuestiones relacionadas