如何避免libgdx SpriteBatch/BitmapFont破坏Texture.bind?

3
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进行渲染。你知道为什么会这样吗?我该怎么做才能在绘制时保留两种材质(网格的“texture”和它的精灵纹理,它们应该不同)?

我删除了一些标签,因为它们似乎与你的问题没有强烈的关联。如果你觉得某些标签可以描述这个问题,请随意编辑添加回来。 - Pubby
2个回答

4

SpriteBatch#end() 必须禁用混合和纹理,因为它假定在调用 SpriteBatch#begin() 时具有干净的 GL 状态上下文,并在 SpriteBatch#end() 上恢复该干净的状态上下文。在您的情况下,您只需要在渲染网格之前通过 glEnable(GL10.GL_TEXTURE_2D) 启用纹理即可。

如果不确定,请查看 SpriteBatch javadocs,其中告诉您它所做的 GL 状态更改。


2

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

Gdx.gl20.glActiveTexture(GL20.GL_TEXTURE0);

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