我试着做一个游戏,你用零件造一艘宇宙飞船,然后绕着它飞。
我想从一系列组件(例如,来自TextureAtlas )创建ship。我想从它的组件纹理中画出船,然后将绘制的船保存为一个大的纹理。(所以我不需要画50个组分纹理,只要一个船纹理。)做这件事最好的方法是什么?
我一直试图使用FrameBuffer来实现这个目的。我已经能够将组件绘制到纹理中,并将纹理绘制到屏幕上,但是无论我尝试了什么,纹理最终都有一个坚实的背景,即帧缓冲区的大小。就像清晰的命令不能透明地清除。这是我目前的绘图代码。这艘船只是一个雪碧,我保存了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();
}发布于 2014-06-26 15:23:05
这里的问题就在于这一行:
FrameBuffer fbo = new FrameBuffer(Format.RGB888, screenwidth, screenheight, false);特别是与Format.RGB888。这一行是说您的FrameBuffer应该是Red (8位),后面是Green (8位),后面是Blue (8位)。但是,请注意,这种格式没有用于Alpha的任何比特(透明性)。为了从您的帧缓冲区中获得透明度,您可能需要使用Format.RGBA8888,这包括一个用于Alpha的额外8位。
希望这能有所帮助。
https://stackoverflow.com/questions/24434236
复制相似问题