Как я могу избежать взлома libgdx SpriteBatch / BitmapFont для Texture.bind? - PullRequest
3 голосов
/ 03 декабря 2011
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.Есть идеи, почему это происходит?Что я должен сделать, чтобы сохранить оба материала в чертеже («текстура» для сетки и ее текстура спрайта, которые должны отличаться)?

Ответы [ 2 ]

4 голосов
/ 03 января 2012

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

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

1 голос
/ 01 апреля 2013

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

Gdx.gl20.glActiveTexture(GL20.GL_TEXTURE0);
...