首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibGDX FrameBuffer

LibGDX FrameBuffer
EN

Stack Overflow用户
提问于 2014-06-26 15:14:25
回答 1查看 9.1K关注 0票数 7

我试着做一个游戏,你用零件造一艘宇宙飞船,然后绕着它飞。

我想从一系列组件(例如,来自TextureAtlas )创建ship。我想从它的组件纹理中画出船,然后将绘制的船保存为一个大的纹理。(所以我不需要画50个组分纹理,只要一个船纹理。)做这件事最好的方法是什么?

我一直试图使用FrameBuffer来实现这个目的。我已经能够将组件绘制到纹理中,并将纹理绘制到屏幕上,但是无论我尝试了什么,纹理最终都有一个坚实的背景,即帧缓冲区的大小。就像清晰的命令不能透明地清除。这是我目前的绘图代码。这艘船只是一个雪碧,我保存了FrameBuffer的纹理。

代码语言:javascript
复制
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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-26 15:23:05

这里的问题就在于这一行:

代码语言:javascript
复制
 FrameBuffer fbo = new FrameBuffer(Format.RGB888, screenwidth, screenheight, false);

特别是与Format.RGB888。这一行是说您的FrameBuffer应该是Red (8位),后面是Green (8位),后面是Blue (8位)。但是,请注意,这种格式没有用于Alpha的任何比特(透明性)。为了从您的帧缓冲区中获得透明度,您可能需要使用Format.RGBA8888,这包括一个用于Alpha的额外8位。

希望这能有所帮助。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24434236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档