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

3

我正在使用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)。只需要查看源代码即可...

我遇到了完全相同的问题。但不知何故,似乎你的问题没有得到解答。你的解决方案是什么?在渲染文本之前,你是否处理了其他纹理,或者你做了什么? - nerdinand
2个回答

5
事实上,Javadocs中也这样写道。经验法则是:所有与OpenGL ES相关的libgdx类都将更改最小数量的状态,并且很可能不会重置查询GL状态成本高昂的事物。

同样的问题问你:我遇到了完全相同的问题。但不知何故,似乎没有回答这个问题。这个问题的解决方案是什么?我的游戏中有多个屏幕,在从使用ShaderPrograms渲染的游戏屏幕切换到使用scene2d渲染的PauseScreen或GameOverScreen时,屏幕会使用游戏中的纹理而不是例如BitmapFont。 - nerdinand

4
我遇到了同样的问题,我的解决方案是在让SpriteBatch(或者在我这种情况下是scene2d)运行之前将活动纹理设置回GL_TEXTURE0:
Gdx.gl20.glActiveTexture(GL20.GL_TEXTURE0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接