因此,我正在尝试制作自定义按钮,为此我需要组合按钮背景的不同部分。为此,我认为使用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);


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

最佳答案

我认为fbo.dispose()调用破坏的程度超出您的预期。

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

我认为这可以视为Libgdx中的错误。通常,颜色纹理的寿命应与FBO的寿命完全不同,因此清理纹理似乎过于激进。但是,试图找出清理纹理的情况可能很复杂.....

08-20 02:16