我正在尝试制作一个游戏,你可以用零件 build 一艘宇宙飞船,然后让它四处飞行等等。
我想从一系列组件(例如从 TextureAtlas 中)创建这艘船。我想从它的组件纹理中绘制船,然后将绘制的船保存为一个大纹理。 (所以我不必绘制 50 个组件纹理,只需绘制一个船舶纹理。解决此问题的最佳方法是什么?
我一直在尝试使用 FrameBuffer 这样做。我已经能够将组件绘制到纹理,并将纹理绘制到屏幕,但无论我尝试什么,纹理最终都会得到一个帧缓冲区大小的纯色背景。这就像 clear 命令无法清除透明一样。这是我目前的绘图代码。这艘船只是一个 Sprite ,我将 FrameBuffer 纹理保存到它。
public void render(){
if (ship == null){
int screenwidth = Gdx.graphics.getWidth();
int screenheight = Gdx.graphics.getHeight();
SpriteBatch fb = new SpriteBatch();
FrameBuffer fbo = new FrameBuffer(Format.RGB888, screenwidth, screenheight, false);
fbo.begin();
fb.enableBlending();
Gdx.gl.glBlendFuncSeparate(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA, GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glClearColor(1, 0, 1, 0);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
fb.begin();
atlas.createSprite("0").draw(fb);
fb.end();
fbo.end();
ship = new Sprite(fbo.getColorBufferTexture());
ship.setPosition(0, -screenheight);
}
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.enableBlending();
batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ZERO);
ship.draw(batch);
batch.end();
}
最佳答案
这里的问题在于这一行:
FrameBuffer fbo = new FrameBuffer(Format.RGB888, screenwidth, screenheight, false);
特别是
Format.RGB888
.这一行是说你的 FrameBuffer 应该是 红色 (8 位)后跟 绿色 (8 位)后跟 蓝色 (8 位)。但是请注意,这种格式没有 的任何位。阿尔法 (透明度)。为了从帧缓冲区中获得透明度,您可能想要使用 Format.RGBA8888
,其中包括额外的 8 位 Alpha。希望这可以帮助。
关于LibGDX 帧缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24434236/