2011-09-07 3 views
3

J'écris un jeu pour Android en utilisant libgdx. Voici un code qui dessine une texture torus:Pourquoi libgdx SpriteBatch/BitmapFont rompt Texture.bind?

Gdx.gl10.glPushMatrix(); 
Gdx.gl10.glTranslatef(center.x, center.y, 0); 
Gdx.gl10.glRotatef(0, 0, 1, angle * 360f/(2f * (float)Math.PI)); 
texture.bind(); 
mesh.render(GL10.GL_TRIANGLE_STRIP); 
Gdx.gl10.glPopMatrix(); 

... et voici un code qui attire un peu de texte:

spriteBatch.begin(); 
spriteBatch.setColor(1, 1, 1, 1); 
float fps = 1f/Gdx.graphics.getDeltaTime(); 
font.draw(spriteBatch, "fps: " + fps, 0, 50); 
spriteBatch.end(); 

Le premier bit de code fonctionne, image après image, jusqu'à ce que le deuxième bit de code s'exécute. Après cela, la bande triangulaire du premier bit est rendue en utilisant uniquement le dernier glMaterial. Une idée de pourquoi cela se passe?

Mise à jour: Résolu! Il s'avère que SpriteBatch.end() appelle glDisable (GL_TEXTURE_2D). Je devais juste lire la source ...

+0

Je vais avoir le même problème . Mais d'une certaine manière, il semble que votre question n'ait pas été répondue. Quelle était votre solution? Avez-vous disposé l'autre texture avant de rendre le texte ou qu'avez-vous fait? – nerdinand

Répondre

5

Cela est également vrai dans les Javadocs. Règle de base: toutes les classes libgdx connectées à OpenGL ES changeront le nombre minimum d'états et ne remettront probablement pas les choses à zéro car l'interrogation de GL pour l'état est coûteuse.

+0

Même question pour vous: j'ai exactement le même problème. Mais de toute façon, il semble que la question n'a pas été répondue. Quelle est la solution pour ceci? J'ai plusieurs écrans dans mon jeu et en passant de mon écran de jeu (rendu avec ShaderPrograms) à un PauseScreen ou GameOverScreen (qui sont rendus avec scene2d), les écrans sont rendus avec des textures du jeu au lieu d'un BitmapFont. – nerdinand

2

je suis tombé sur le même problème et ma solution était de définir la texture actif vers GL_TEXTURE0 avant de laisser SpriteBatch (ou dans mon cas scene2d) faire son truc:

Gdx.gl20.glActiveTexture(GL20.GL_TEXTURE0);