使用libgdx创建动态纹理

时间:2014-03-13 16:28:01

标签: android opengl-es libgdx alphablending

我正在开发一个文字游戏,我在游戏加载时动态创建字母图块的纹理,包括背景图像和字体。

要做到这一点,我正在将pixmaps绘制到pixmaps上,这一切都很好,直到我开始进行缩放。 pixmaps上的字体缩放很糟糕,即使打开了双线性滤波(左下图),即使我的缩放字体在其他地方看起来很不错。

所以我决定绕过这个我使用帧缓冲区,渲染所有内容然后将其复制到像素图并从中创建纹理。这样我可以使用gpu过滤,它应该看起来与我的其他字体完全相同,(下面的中间图像)但它仍然看起来不像其他字体那么好。外围有一条细微的暗线,看起来alpha混合不能正常工作。

然后我尝试在运行时使用字体在瓷砖上直接绘制,以确保它不是我的想象,并且通过平滑混合到下面的图像(下图右图)看起来肯定更好,但这会影响我的帧速率很多。

examples

所以我的问题是,为什么绘制到帧缓冲区时不会产生与绘制到屏幕时相同的结果?代码如下。

    Texture tx = Assets.loadTexture("bubbles/BubbleBlue.png");
    tx.setFilter(TextureFilter.Linear, TextureFilter.Linear);
    SpriteBatch sb = new SpriteBatch();
    FrameBuffer fb = new FrameBuffer(Format.RGBA8888,
            LayoutManager.getWidth(), LayoutManager.getHeight(), false);
    fb.begin();
    sb.begin();
    sb.draw(tx, 0, 0, LetterGrid.blockWidth, LetterGrid.blockHeight);

    Assets.candara80.font.getRegion().getTexture()
            .setFilter(TextureFilter.Linear, TextureFilter.Linear);
    Assets.candara80.setSize(0.15f);

    TextBounds textBounds = Assets.candara80.getBounds(letter);

    Assets.candara80.drawText(sb, letter,
            (LetterGrid.blockWidth - textBounds.width) / 2,
            (LetterGrid.blockHeight + textBounds.height) / 2);

    sb.end();

    Pixmap pm = ScreenUtils.getFrameBufferPixmap(0, 0,
            (int) LetterGrid.blockWidth, (int) LetterGrid.blockHeight);
    Pixmap flipped = flipPixmap(pm);

    result = new Texture(flipped);

    fb.end();
    pm.dispose();
    flipped.dispose();
    tx.dispose();
    fb.dispose();
    sb.dispose();

1 个答案:

答案 0 :(得分:0)

设置PROJECTION就是问题。

实施例

        public Texture texture(Color fg_color, Color bg_color)
        {
            Pixmap pm = render( fg_color, bg_color );
            texture = new Texture(pm);//***here's your new dynamic texture***
            disposables.add(texture);//store the texture
        }
    //---------------------------
        public Pixmap render(Color fg_color, Color bg_color)
        {
            int width = Gdx.graphics.getWidth();
            int height = Gdx.graphics.getHeight();

            SpriteBatch spriteBatch = new SpriteBatch();

            m_fbo = new FrameBuffer(Format.RGB565, (int)(width * m_fboScaler), (int)(height * m_fboScaler), false);
            m_fbo.begin();
            Gdx.gl.glClearColor(bg_color.r, bg_color.g, bg_color.b, bg_color.a);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
/**set PROJECTION**/
            Matrix4 normalProjection = new Matrix4().setToOrtho2D(0, 0, Gdx.graphics.getWidth(),  Gdx.graphics.getHeight());
            spriteBatch.setProjectionMatrix(normalProjection);

            spriteBatch.begin();
            spriteBatch.setColor(fg_color);
            //do some drawing ***here's where you draw your dynamic texture***
            ...
            spriteBatch.end();//finish write to buffer

            pm = ScreenUtils.getFrameBufferPixmap(0, 0, (int) width, (int) height);//write frame buffer to Pixmap

            m_fbo.end();
    //      pm.dispose();
    //      flipped.dispose();
    //      tx.dispose();
            m_fbo.dispose();
            m_fbo = null;
            spriteBatch.dispose();
    //      return texture;
            return pm;
        }