2010-03-19 6 views
2

Je suis nouveau sur OpenGL, et j'ai un problème étrange avec mes textures - à la recherche d'un coup de pouce dans la bonne direction.glBindTexture Problème avec OpenGL ES sur iPhone

J'ai une application qui utilise une technique de rendu à la texture pour accomplir un certain effet - il fonctionne à merveille. Je dessine un tampon hors écran chaque fois que j'en ai besoin et je peux l'utiliser comme texture dans ma boucle de rendu.

Cette texture n'est mise à jour que si nécessaire - elle est dessinée à l'écran comme la plupart des cadres.

J'ai des barres d'outils qui sont également dessinées en utilisant OpenGL, au-dessus de cette surface en utilisant un atlas de texture, et en utilisant un mélange. J'ai récemment commencé à essayer d'incorporer un système de particules dans l'application, mais chaque fois que j'essaie de rendre mes graphiques de système de particules, je "perds" ma texture que j'ai rendue dans la première étape - c'est-à-dire son contenu disparaît.

J'ai tracé cela à l'appel de glBindTexture qui lie la texture des particules.

EDIT: Je peux reproduire ceci dans ma routine de dessin de barre d'outils simple, code ci-dessous. Ceci est une routine brute qui anime les graphiques de la barre d'outils sur et hors écran.

Lorsque je décommente les deux premières lignes de drawToolBar(), ma texture rendue en mémoire disparaît, c'est-à-dire que l'appel drawarrays dans ma boucle de rendu ne restitue rien à l'écran. Grâce à des tests, j'ai déterminé que l'appel glBidTexture est ce qui déclenche cela. (Par exemple, je peux rendre des quadrichromies sur ma texture, mais pas texturées)

Cependant, tout va bien si j'autorise drawToolbar() à fonctionner comme ci-dessous - la seule différence est que l'appel éventuel à drawTools() est enveloppé dans glPush/Pop, et est traduit.

Notez que le rendu de la barre d'outils fonctionne toujours - il y a un effet secondaire, une conséquence ou un problème de bogue qui se produit ici, ce qui provoque la disparition de ma texture d'arrière-plan.

Toutes les idées sont les bienvenues - cela me rend fou.

Le code:

void drawTools() 
{ 
//*Texture Coordinate Stuff Snipped*// 

glBindTexture(GL_TEXTURE_2D, _buttontexture); 

glEnable(GL_TEXTURE_2D); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glVertexPointer (2, GL_FLOAT, 0,bottomToolQuads); 
glTexCoordPointer(2, GL_FLOAT, 0,texc); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4); 
glDrawArrays(GL_TRIANGLE_STRIP, 8, 4); 
glDrawArrays(GL_TRIANGLE_STRIP, 12, 4); 
glDrawArrays(GL_TRIANGLE_STRIP, 16, 4); 
glDrawArrays(GL_TRIANGLE_STRIP, 20, 4); 

glDisable(GL_TEXTURE_2D); 

}

void drawToolBar() 

{

//drawTools(); 
//return; 

if(_toolbarState ==0) 
{ 
    drawTools(); 
} 
else if(_toolbarState == 2)//hiding 
{ 
    _toolbarVisiblePct -= TOOLINC; 

    if(_toolbarVisiblePct <= 0.0) 
    { 
     _toolbarState = 1; 
     _toolbarVisiblePct = 0.0; 
    } 
    else 
    { 
     glPushMatrix(); 
     glTranslatef(0.0, -(1-_toolbarVisiblePct) * 50, 0); 
     drawTools(); 
     glPopMatrix(); 
    } 
} 
else if(_toolbarState == 3) //showing 
{ 
    _toolbarVisiblePct += TOOLINC; 
    if(_toolbarVisiblePct >= 1.0) 
    { 
     _toolbarState = 0; 
     _toolbarVisiblePct = 1.0; 
     drawTools(); 
    } 
    else 
    { 
     glPushMatrix(); 
     glTranslatef(0.0, -(1-_toolbarVisiblePct) * 50, 0); 
     drawTools(); 
     glPopMatrix(); 

    } 
} 

}

+0

Désolé, mais je ne pense pas que je comprends ce que vous demandez. Si les particules rendues en quadrichromie rend bien tout, quelle est la question? – slf

+0

Je voudrais les rendre texturés - pas colorés. J'ai un exemple de code intéressant à publier - juste un moment. –

Répondre

1

On dirait que vous désactiver la texture rendu à la fin de la méthode drawTools. OpenGL est une machine à états, si vous désactivez un état, il restera désactivé jusqu'à ce que vous l'activiez à nouveau.