Как избежать нарушения Texture.bind libgdx SpriteBatch/BitmapFont?

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. Любая идея, почему это происходит? Что я должен сделать, чтобы сохранить оба материала в рисовании («текстура» для сетки и ее текстура спрайта, которые должны быть разными)?


person Duna    schedule 03.12.2011    source источник
comment
Я удалил некоторые из ваших тегов, поскольку они, похоже, не имеют прямого отношения к вашему вопросу. Не стесняйтесь редактировать некоторые из них, если вы чувствуете, что описываете проблему.   -  person Pubby    schedule 05.12.2011


Ответы (2)


SpriteBatch#end() должен отключить смешивание и текстурирование, поскольку он предполагает чистый контекст состояния GL при вызове SpriteBatch#begin() и восстанавливает этот чистый контекст состояния при SpriteBatch#end(). В вашем случае вам просто нужно включить текстурирование через glEnable(GL10.GL_TEXTURE_2D), прежде чем вы начнете визуализировать свою сетку.

Если вы сомневаетесь, ознакомьтесь с javadocs SpriteBatch, в котором рассказывается об изменениях состояния GL, которые он вносит.

person badlogic    schedule 03.01.2012

Я столкнулся с той же проблемой, и мое решение состояло в том, чтобы установить активную текстуру обратно в GL_TEXTURE0, прежде чем позволить SpriteBatch (или, в моем случае, scene2d) делать свое дело:

Gdx.gl20.glActiveTexture(GL20.GL_TEXTURE0);
person nerdinand    schedule 01.04.2013