2010-11-24 6 views
3

Mise à niveau vers le SDK iOS 4.2 J'ai plusieurs problèmes de comportement dans mon application (un autre est demandé here). Celui que je vais demander votre aide concerne une vue OpenGL (une sous-classe EAGLView) qui ne rend plus le modèle 3D que je mets enPourquoi mon EAGLVIew ne s'affiche plus dans iOS 4.2?

La vue est allouée et elle semble reconnaître les gestes mais son contenu n'est pas visible (J'ai vérifié qu'il s'agit de la vue et non du égarant du modèle en coloriant l'arrière-plan: il ne colore pas glClearColor()).

Quand j'appuyez deux fois il redimensionner (il en va de plein écran, avant cela, il est un peu UIView) appelant cette méthode:

- (void)animateToGrow{ 
    DNSLog(@"grow"); 
    grow = YES; 
    oldFrame = self.frame; 
    oldCenter = self.center; 

    [UIView beginAnimations:@"MoveAndStrech" context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 

    self.frame = CGRectMake(0, 0, WIDTH, HEIGHT); 
    self.center = CGPointMake(CENTER_X, CENTER_Y); 
    [UIView commitAnimations]; 
    [self setupGLPerspectiveNear:0.1 far:1000]; 
} 

et comme par magie le modèle apparaît, et même l'arrière-plan se colore .

J'ai une méthode qui le redimensionne et le ramène à sa position de trame et de centre précédente et quand il est appelé, la vue devient 'empty' encore.

Avant Une suggestion? (Je peux poster plus de code si nécessaire)

MISE À JOUR Ce qui se passe sur le simulateur (ne peut pas tester sur un appareil au moment). Si c'est un bug reconnu, est-ce que quelqu'un a une référence à partir de docs Apple?

MISE À JOUR 2 J'utilise OpenGL ES 1.1 et non 2.0.

Voici ce que je fais dans layoutSubViews de EAGLView:

- (void)layoutSubviews 
{ 
    [EAGLContext setCurrentContext:_context]; 
    [self destroyFramebuffer]; 
    [self createFramebuffer]; 
    [self drawView]; 
} 

Et ceci est mon 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 (_useDepthBuffer) 
    { 
     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) 
    { 
     NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); 
     return NO; 
    } 

    return YES; 
} 

MISE À JOUR 3

Si je crée la vue en lui donnant le cadre plein écran (320x480) Il semble rendu correctement. D'une certaine manière, il est lié aux dimensions de la vue

Répondre

13

Il m'a fallu une éternité pour le savoir. Pas bien documenté du tout, mais c'est dans les docs de la pomme. Sur OS 4.2 et supérieur, vous avez besoin de la taille EAGLview pour être un multiple de 32 pixels dans les deux dimensions pour que cela fonctionne.

+0

il semble que vous avez raison Mike, donnant des valeurs multiple de 32 il est rendu correctement. Où est-il écrit dans les docs? – rano

+2

Il est dit dans ce document http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/OpenGLESPlatforms/OpenGLESPlatforms.html sous le paragraphe 'Release Notes et meilleures pratiques pour le PowerVR SGX' – rano

+0

Je suppose qu'ils ont encore changé pour iOS> = 6.0, puisque l'iPhone 5 a une hauteur d'écran de 1136, qui divisé par 32 donne 35.5 ... –

2

Est-ce dans le simulateur? Si oui, alors c'est un bug connu dans le simulateur iOS 4.2. Ce bug n'a pas d'impact sur les appareils eux-mêmes.

+0

damn Je ne peux pas tester sur un vrai périphérique de l'appareil, pouvez-vous lier où ce bug est documenté s'il vous plaît? – rano

+0

Est-ce que quelqu'un a trouvé la documentation pour ce bug? – Daniel

+0

Il a un impact sur les appareils, si vous avez iOS4.2, il ne montre pas le EAGLView du tout (au moins pour moi) – Daniel

1

Comment configurez-vous votre couche d'hébergement OpenGL et son affichage? Lorsque j'essaie les exemples d'applications OpenGL ES que j'ai pour here et here, les deux s'exécutent très bien sur le simulateur 4.2, ainsi que sur le périphérique. Peut-être pourriez-vous comparer l'initialisation utilisée dans ces exemples avec la vôtre et voir s'il y a quelque chose que vous pourriez manquer dans le processus d'installation.

+0

J'ai eu un regard comparatif sur le code Cube et mon implémentation EAGLView et la différence que je trouve est que Je détruis les tampons avant de créer de nouveaux dans 'layoutSubViews' alors qu'un seul est créé dans' resizeFromLayer: 'plus tard appelé' layoutSubViews' dans l'exemple du cube. Si je commente la ligne de destruction, la vue ne sera pas rendue à mesure que je la ferai grandir. – rano

+0

Ah l'autre différence est que j'utilise un depthbuffer mais je suppose que cela n'a pas d'importance. – rano

+0

@rano - Maintenant que vous le faites remarquer, je fais quelque chose de similaire lorsque je redimensionne la vue d'hébergement OpenGL dans mon application Molecules (source sur http://www.sunsetlakesoftware.com/molecules, si je peux obtenir le retour du site up) et je vois le même artefact d'affichage dans le simulateur. Sur l'appareil, cela fonctionne bien. Je vais déposer un rapport de bug. –

Questions connexes