2009-08-04 12 views
0

J'essaie de faire un jeu simple en utilisant OpenGLES. J'ai deux EAGLViews (menu et jeu). Chaque vue possède son propre viewController. L'initialisation des vues est effectuée par la méthode initWithNIBName du viewController. Et quand je veux montrer la vue, j'utilise simplement la méthode addSubview de la fenêtre principale. La vue du jeu est initialisée une seule fois au moment du lancement. La vue de menu est initialisée seulement si c'est nécessaire. Le problème est que lorsque je passe de la vue de jeu au menu, puis de retour, puis que je redessine la vue du jeu, quelque chose ne va pas. (Je mets EAGLContext dans la méthode drawView avant de dessiner, donc le contexte peut être correct). Vous ne savez pas où est le problème? Ou si l'ensemble de la commutation est mal géré, donnez-moi un conseil et s'il vous plaît. Merci pour les réponses.opengles voir le problème de commutation

Répondre

1

Je suppose que vous avez un problème avec la texture ne s'affiche pas correctement?

Je ne connais pas la réalité derrière OpenGL, mais voici mon hypothèse: Chaque fois que vous revenez à EAGLView, le EAGLContext de EAGLView est modifié. (si vous avez copié et collé à partir du modèle OpenGLES) Les textures ne peuvent être chargées que lorsque le contexte est dans son état correct, ou bien vous ne pouvez charger aucune texture. Maintenant, en laissant le EAGLView, et revenir, vous instanciation d'une nouvelle EAGLContext de initWithCoder: (NSCoder *) codeur:

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

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

Alors, comment pouvons-nous préserver ce contexte? Je le rend mondial. Aussi simple que cela. Et quand EAGLView doit être instancié une fois de plus, demandez-lui si le "global" EAGLContext est nul ou non. Si c'est nul, instanciez-le, sinon ne faites rien. Et ne jamais publier ou libérer ce EAGLContext global à moins que vous ne vouliez quitter votre programme.

Cela fonctionne pour moi, mais encore une fois, mon hypothèse ci-dessus peut ne pas être correcte. Si quelqu'un connaît la réalité, veuillez me faire la leçon. J'ai aussi humblement besoin de conseils. Je veux vraiment savoir pourquoi cela se produit et pourquoi devons-nous le faire aussi.

Et au fait, est-ce que cela répond à votre question, Jenicek?

+0

Lorsque vous changez de vue et qu'une autre vue OpenGL est affichée à l'écran, vous devez appeler [EAGLContext setCurrentContext: context] avec le contexte OpenGL correct. Sinon, les appels gl * modifient toujours le contenu de l'autre vue OpenGL. –

Questions connexes