为什么libgdx SpriteBatch / BitmapFont会破坏Texture.bind?

时间:2011-09-07 02:47:35

标签: java android opengl-es libgdx

我正在使用libgdx为Android编写游戏。这是一些绘制纹理环面的代码:

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();

...这里有一些代码可以提取一些文字:

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

第一位代码一帧又一帧地工作,直到第二位代码运行。之后,第一位的三角形条带仅使用最新的glMaterial渲染。知道为什么会这样吗?

更新:已解决!事实证明SpriteBatch.end()调用glDisable(GL_TEXTURE_2D)。只需阅读来源......

2 个答案:

答案 0 :(得分:5)

它实际上也是在Javadocs中也是如此。经验法则:连接到OpenGL ES的所有libgdx类都将更改最小状态量,并且很可能不会重置事物,因为查询状态的GL代价很高。

答案 1 :(得分:2)

我遇到了同样的问题,我的解决方法是在让SpriteBatch(或者在我的情况下为scene2d)中执行其操作之前将活动纹理设置回GL_TEXTURE0:

Gdx.gl20.glActiveTexture(GL20.GL_TEXTURE0);