Libgdx - 将帧缓冲区纹理渲染到屏幕时的不同大小

时间:2017-04-23 19:49:55

标签: java libgdx lwjgl framebuffer

由于我的设计,我想摆脱NinePatch对象,但我用它来使用framebuffer初始化所需大小的纹理,然后将这些纹理应用到我的自定义对象

我是LibGDX和GL的新手。

问题是当我将FBO纹理绘制到屏幕时图像太小,为什么

我从这里抓住所有这些的骨架:https://stackoverflow.com/a/7632680/401529

我的RenderToTexture类是:

public class RenderToTexture {
private float fbScaler = 1f;
private boolean fbEnabled = true;
private FrameBuffer fb = null;
private TextureRegion fbReg = null;


[... more constructors ... ]

/**
 *
 * @param scale
 */
public RenderToTexture(int width, int height, float scale, boolean hasDepth) {
    if(width == -1){
        width = (int) (Gdx.graphics.getDisplayMode().width * scale);
    }
    if(height == -1){
        height = (int) (Gdx.graphics.getDisplayMode().height * scale);
    }

    fb = new FrameBuffer(
            Pixmap.Format.RGBA8888,
            (int)(width * fbScaler),
            (int)(height * fbScaler),
            hasDepth
    );

    fbReg = new TextureRegion(fb.getColorBufferTexture());
    fbReg.flip(false,false);
}

public void begin(){
    if(fbEnabled) {
        fb.begin();
        Gdx.gl.glClearColor(0, 0,0,0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    }
}
public TextureRegion end(){
    if(fb != null)
    {
        fb.end();
        return fbReg;
        // batch.draw(fboRegion, 0, 0);
    }
    return null;
}

}

我的工具类:

public class ImageUtils {
public static TextureRegion ninePatchToTextureRegion(NinePatch patch, int width, int height){
    return ninePatchToTextureRegion(new NinePatchDrawable(patch), width, height);
}

public static TextureRegion ninePatchToTextureRegion(NinePatchDrawable patch, int width, int height){
    RenderToTexture r2t = new RenderToTexture(width, height, 1, false);
    SpriteBatch sb = new SpriteBatch();
    r2t.begin();
    sb.begin();
    patch.draw(sb, 0, 0, width, height);
    sb.end();
    sb.dispose();

    return r2t.end();
}

}

然后我在创建精灵时调用这个util类:

NinePatchDrawable ninepatchtest = new NinePatchDrawable(
                new NinePatch(new Texture(Gdx.files.internal("img/ui/btn-retro-blue.png")), 5, 5, 5, 5)
        );
TextureRegion result = ImageUtils.ninePatchToTextureRegion(ninepatchtest, 200, 100);
        sprite = new Sprite(result);

当前结果是(左)和模拟所需结果的大小(右)

screenshot

编辑:相机尺寸为显示模式尺寸,胶合到屏幕,无变焦,无移动。

编辑:修复了@ Tenfour04

建议的丢失处置

如果这种方式不是最好的方式,我会接受新的替代方案

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的“HALF”:

正如我在本例中看到的LibGDX - Drawing to a FrameBuffer does not work我想念setProjectionMatrix到SpriteBatch对象,所以渲染到纹理类的begin()方法现在是:

public SpriteBatch begin(){
    SpriteBatch batch = null;

    if(fbEnabled) {
        fb.begin();
        Gdx.gl.glClearColor(0, 0,0,0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        Matrix4 m = new Matrix4();
        m.setToOrtho2D(0, 0, fb.getWidth(), fb.getHeight());

        batch = new SpriteBatch();
        batch.setProjectionMatrix(m);
    }

    return batch;
}

现在renderToTexture begin()返回spritebatch,所以:

public static TextureRegion ninePatchToTextureRegion(NinePatchDrawable patch, int width, int height){
    RenderToTexture r2t = new RenderToTexture(width, height, 1, false);
    SpriteBatch sb = r2t.begin();
    sb.begin();
    patch.draw(sb, 0, 0, width, height);
    sb.end();
    sb.dispose();
    return r2t.end();
}

这解决了FBO绘制纹理的大小,但是在framebuffer之外绘制了九个补丁,并使用帧缓冲区进行拉伸......