【问题标题】:Why is libgdx SpriteBatch/BitmapFont breaking Texture.bind?为什么 libgdx SpriteBatch/BitmapFont 会破坏 Texture.bind?
【发布时间】:2011-09-07 02:47:34
【问题描述】:

我正在使用 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)。只需要阅读源代码...

【问题讨论】:

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

标签: java android opengl-es libgdx


【解决方案1】:

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

【讨论】:

  • 向您提出同样的问题:我遇到了完全相同的问题。但不知何故,这个问题似乎没有得到回答。解决方案是什么?我的游戏中有多个屏幕,从我的游戏屏幕(使用 ShaderPrograms 渲染)切换到 PauseScreen 或 GameOverScreen(使用 scene2d 渲染),屏幕使用游戏中的纹理而不是 BitmapFont 进行渲染。
【解决方案2】:

我遇到了同样的问题,我的解决方案是将活动纹理设置回 GL_TEXTURE0,然后让 SpriteBatch(或者在我的情况下为 scene2d)做它的事情:

Gdx.gl20.glActiveTexture(GL20.GL_TEXTURE0);

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多