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
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
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
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 ... –