2016-05-01 6 views
1

У меня есть одна проблема с буфером кадров openGL. Я хочу достичь:Буфер кадров OpenGL + LibGDX

  1. Bind FBO1. Нарисуйте изображение1 в FBO1. Отвяжите FBO1.
  2. Bind FBO2. Нарисуйте FBO1 до FBO2. Отвяжите FBO2.
  3. Bind FBO1. Нарисуйте изображение2 в FBO1. Отвяжите FBO1.
  4. Draw FBO2 к экрану

То, что я ожидал увидеть: я ожидаю увидеть только image1 на экране, так как он обращается в первую FBO, а затем первый FBO обращается на второй FBO

В чем проблема: Я вижу как изображение1, так и изображение2 на нарисованном, что должно быть невозможным, потому что только первое изображение рисуется в FBO1, когда FBO1 рисуется в FBO2, и я рисую 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(); 

Жеребьевка() методы немного долго, потому что я хочу передать flipY = True, так как OpenGL рисует кадр буферные вверх-вниз.

Параметры жеребьевке() метод, который я использую являются:

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

Что мне не хватает? Почему это происходит?

ответ

1

Каждый раз, когда вы начинаете рисовать на другой FrameBuffer, вам нужно очистить его, если вы не хотите старое содержимое.

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

Кроме того, необходимо, чтобы очистить экран в начале render(), если вы не хотите, чтобы содержимое от последнего вызова render().

Кроме того, если вы покрываете весь фон своим изображением, вы можете также отключить смешение на SpriteBatch.

+0

На самом деле я назвал glClear, но я сделал это, прежде чем связывать буфер, и каким-то образом я этого не заметил. Но теперь, увидев ваш комментарий, я снова просмотрел свой код и на этот раз увидел его. Спасибо! –

Смежные вопросы