LibGDX - 绘制到FrameBuffer不起作用

时间:2014-06-02 21:28:04

标签: java opengl libgdx framebuffer

所以我正在尝试制作自定义按钮,我需要将按钮背景的不同部分组合在一起。要做到这一点,我认为使用FrameBuffer会起作用,但它没有给出可行的结果。因此,我尝试通过编写一个简单的测试方法来测试我的FrameBuffer绘图方法,该方法返回在每次render()调用时绘制到显示的纹理。这个方法在这里(请注意,它是一种测试方法,所以它可能稍微优化一点):

    private Texture test()
{
    BitmapFont f = ReverseBlade.fontTitle;
    f.setColor(Color.LIGHT_GRAY);

    FrameBuffer fbo = new FrameBuffer(Format.RGBA8888, (int)f.getBounds("Hi").width, (int)f.getBounds("Hi").height, false);
    Batch b = ReverseBlade.batch;
    OrthographicCamera c = new OrthographicCamera(fbo.getWidth(), fbo.getHeight());

    c.setToOrtho(false);
    c.update();
    b.setProjectionMatrix(c.combined);

    fbo.begin();
    b.begin();

    f.draw(b, "Hi", 0, 0);

    b.end();
    fbo.end();

    Texture t = fbo.getColorBufferTexture();

    fbo.dispose();

    b.setProjectionMatrix(ReverseBlade.camera.combined);

    return t;
}

但是,没有显示任何内容。屏幕很暗......我试过没有相机和我不能再记得的其他多种变化。我做错了什么?

半解决方案 我最终要做的是为FrameBuffer创建一个新的Matrix4对象:

Matrix4 m = new Matrix4();
m.setToOrtho2D(0, 0, fbo.getWidth(), fbo.getHeight());
batch.setProjectionMatrix(m);

但是,这使得绘制的所有内容都颠倒过来,如下所示: Upside Down

5 个答案:

答案 0 :(得分:3)

我认为fbo.dispose()来电正在摧毁超出你想要的范围。

请参阅the source并注意它会破坏colorTexture的位置,这是getColorBufferTexture()的结果。

我认为这可能被认为是Libgdx中的一个错误。颜色纹理通常应该具有与FBO非常不同的寿命,因此清理纹理似乎有点过于激进。然而,试图找出清理纹理的情况可能很复杂......

答案 1 :(得分:1)

因此,按照我在Half Solution中添加的内容,我所要做的就是使用FBo中的纹理创建一个新的Sprite对象并调用flip(false,true)!

答案 2 :(得分:1)

可能这是一个解决方法来dispose()帧缓冲并保持纹理活着。我做了以下事情:

public class TextureSaveFBO extends FrameBuffer {
    static final Texture DUMMY = new Texture(1, 1, Format.RGB565) {
        public void dispose() {
        };
    };

    public TextureSaveFBO(Format format, int width, int height,
            boolean hasDepth) {
        super(format, width, height, hasDepth);
    }

    @Override
    public void dispose() {
        // prevents the real texture of dispose()
        Texture t = colorTexture;
        colorTexture = DUMMY;
        super.dispose();
        colorTexture = t;
    }
}

答案 3 :(得分:1)

只是预先准备:

OrthographicCamera c = new OrthographicCamera(fbo.getWidth(), fbo.getHeight());
c.setToOrtho(false);

除非您知道自己在做什么,否则这可能有害:c.setOrtho(false)执行以下操作:

  

使用适合屏幕分辨率的视口将此相机设置为正交投影,以(Gdx.graphics.getWidth()/ 2,Gdx.graphics.getHeight()/ 2)为中心,y轴朝上或下来。

因此,即使您在OrthographicCamera的构造函数中指定您希望视口具有帧缓冲区大小,您也可以通过以下调用覆盖屏幕大小并以屏幕中心为中心的视口来覆盖它。

您应该这样做:

camera.setToOrtho(false, fbo.getWidth(), fbo.getHeight());

答案 4 :(得分:0)

自LibGDX 1.6.5以来

Issue解决了。

现在可以覆盖disposeColorBuffer方法以不处理渲染纹理。