traslacion sirve rotacion que para matrices glpushmatrix funciones escalamiento coordenadas iphone opengl-es

sirve - ¿Por qué llamar glMatrixMode(GL_PROJECTION) me da EXC_BAD_ACCESS en una aplicación de iPhone?



uiwebview facebook (5)

Tengo una aplicación para iphone donde llamo a estas tres funciones en appDidFinishLaunching:

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

Cuando paso con el depurador obtengo EXC BAD ACCESS cuando ejecuto la primera línea. ¿Alguna idea de por qué está pasando esto?

Por cierto 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.


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.

¿Puedes confirmar que rect todavía está asignado?


Me encontré con esto con las llamadas OpenGL si dos hilos intentan dibujar en la escena OpenGL a la vez. Sin embargo, eso no suena como lo que estás haciendo.

¿Inicializó correctamente el contexto de visualización y el framebuffer antes de esta llamada? Por ejemplo, en mi subclase UIView que hace el dibujo OpenGL, invoco lo siguiente en su método initWithCoder:

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 un 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ás haciendo un dibujo de OpenGL en applicationDidFinishLaunching :? ¿No sería una vista o vista el controlador un lugar más apropiado para las llamadas OpenGL que su UIApplicationDelegate?


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


Es poco probable que sea el problema dada la fecha en que envió el error, pero también vería algo como esto si utiliza el código de ejemplo de Apple y ejecuta en un dispositivo con capacidad ES 2.0, ya que elimina la pila de la 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.


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 establezca correctamente por [EAGLContext setCurrentContext:].