因此,我正在尝试制作自定义按钮,为此我需要组合按钮背景的不同部分。为此,我认为使用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的寿命完全不同,因此清理纹理似乎过于激进。但是,试图找出清理纹理的情况可能很复杂.....