OpenGL帧缓冲区+ LibGDX

时间:2016-05-01 14:06:22

标签: java opengl graphics libgdx framebuffer

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

  1. 绑定FBO1。将image1绘制到FBO1。解开FBO1。
  2. 绑定FBO2。将FBO1绘制到FBO2。解开FBO2。
  3. 绑定FBO1。将image2绘制到FBO1。解开FBO1。
  4. 将FBO2绘制到屏幕
  5. 我期待看到的内容: 我希望屏幕上只能看到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
    

    我错过了什么?为什么会这样?

1 个答案:

答案 0 :(得分:1)

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

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

如果您不想要上次拨打render()的内容,还需要在render()开头清除屏幕。

此外,如果您使用图像覆盖整个背景,也可以在SpriteBatch上禁用混合。