libgdx 中帧缓冲区的模棱两可的结果

Posted

技术标签:

【中文标题】libgdx 中帧缓冲区的模棱两可的结果【英文标题】:Ambiguous results with Frame Buffers in libgdx 【发布时间】:2013-02-06 13:12:08 【问题描述】:

我在 libgdx 中使用 FrameBuffer 类得到以下奇怪的结果。

这是产生此结果的代码:

// This is the rendering code
@Override
public void render(float delta) 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);

    stage.act();
    stage.draw();

    fbo.begin();
    batch.begin();
    batch.draw(heart, 0, 0);
    batch.end();
    fbo.end();  

    test = new Image(fbo.getColorBufferTexture());
    test.setPosition(256, 256);
    stage.addActor(test);


//This is the initialization code
@Override
public void show() 
    stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
    atlas = Assets.getAtlas();
    batch = new SpriteBatch();

    background = new Image(atlas.findRegion("background"));     
    background.setFillParent(true); 
    heart = atlas.findRegion("fluttering");
    fbo = new FrameBuffer(Pixmap.Format.RGBA8888, heart.getRegionWidth(), heart.getRegionHeight(), false);

    stage.addActor(background);
    Image temp = new Image(new TextureRegion(heart));
    stage.addActor(temp);

虽然帧缓冲区的宽度和高度与图像的相同(71 x 72),但为什么我得到了我在帧缓冲区上绘制的心脏被翻转并且比原来的要小。

【问题讨论】:

+1 用于显示您的问题的带注释的图片。不错。 【参考方案1】:

您的 SpriteBatch 使用了错误的投影矩阵。由于您要渲染到自定义大小的 FrameBuffer,因此您必须手动设置一个。

projectionMatrix = new Matrix4();
projectionMatrix.setToOrtho2D(0, 0, heart.getRegionWidth(), heart.getRegionHeight());
batch.setProjectionMatrix(projectionMatrix);

【讨论】:

这是正确的答案,另一个只是一种解决方法。在很多情况下,您需要使用尺寸与屏幕尺寸不匹配的 FB。【参考方案2】:

为了解决这个问题,帧缓冲区的宽度和高度必须等于舞台的宽度和高度,如下所示:

fbo = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);

【讨论】:

以上是关于libgdx 中帧缓冲区的模棱两可的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 libgdx 中重用帧缓冲纹理

Libgdx/Opengl alpha blending(结果 alpha 被源 alpha 替换)

空白图像(帧缓冲区)

Libgdx - FrameBuffer 渲染和 FitViewport

libgdx 贴花未绘制到模板缓冲区中

WebGL入门(四十一)-使用帧缓冲区对象(FBO)实现将渲染结果作为纹理绘制到另一个物体上