我对openGL帧缓冲区有一个问题。
我要实现:


绑定FBO1。将image1绘制到FBO1。解除绑定FBO1。
绑定FBO2。将FBO1绘制为FBO2。取消绑定FBO2。
绑定FBO1。将image2绘制到FBO1。解除绑定FBO1。
将FBO2绘制到屏幕上


我希望看到的是:
我希望在屏幕上只看到image1,因为它是在第一个FBO中绘制的,然后第一个FBO被绘制在第二个FBO上

问题是什么:
我看到在image1和image2上都是绘制的,这是不可能的,因为当在FBO2中绘制FBO1时,只有第一个图像在FBO1中绘制,而我仅将FBO2绘制到屏幕上。

这是重现该问题的代码:

// --- in show() method
this.img = new Texture(Gdx.files.internal("shaders/image.jpg"));
this.img2 = new Texture(Gdx.files.internal("shaders/image2.jpg"));
this.fbo = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
this.fbo2 = new FrameBuffer(Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);

// --- in render() method
// start frame buffer 1 and draw image 1
this.fbo.begin();
{
    this.batch.begin();
    this.batch.draw(this.img, 0, 0, 400, 400, 0, 0, this.img.getWidth(), this.img.getHeight(), false, true);
    this.batch.end();
}
this.fbo.end();

// start frame buffer 2 and frame buffer 1 output
this.fbo2.begin();
{
    this.batch.begin();
    this.batch.draw(this.fbo.getColorBufferTexture(), 500, 0, this.fbo.getColorBufferTexture().getWidth(), this.fbo.getColorBufferTexture().getHeight(), 0, 0, this.fbo.getColorBufferTexture()
            .getWidth(), this.fbo.getColorBufferTexture().getHeight(), false, true);
    this.batch.end();
}
this.fbo2.end();

// start frame buffer 1 again and draw image 2
this.fbo.begin();
{
    this.batch.begin();
    this.batch.draw(this.img2, 150, 150, 400, 400, 0, 0, this.img2.getWidth(), this.img2.getHeight(), false, true);
    this.batch.end();
}
this.fbo.end();

// draw frame buffer 2 to the batch
this.batch.begin();
this.batch.draw(this.fbo2.getColorBufferTexture(), 0, 0);
this.batch.end();


draw()方法有点长,因为我要传递flipY = true,因为OpenGL上下颠倒地绘制帧缓冲区。

我正在使用的draw()方法的参数是:

Texture texture, float x, float y, float width, float height, int srcX, int srcY, int srcWidth, int srcHeight, boolean flipX, boolean flipY


我想念什么?为什么会这样呢?

最佳答案

每次开始在另一个FrameBuffer上绘制时,如果不想使用旧内容,则需要清除它。

frameBuffer.begin();
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
//...


如果您不希望最后一次调用render()的内容,还需要清除render()开头的屏幕。

另外,如果您用图像覆盖整个背景,则最好禁用SpriteBatch上的混合。

07-26 00:05