2014-02-24 157 views
0

我想在opengl中實現一個後期處理,我的問題是透明圖像在非透明圖像上。在渲染場景的同時,它首先呈現非透明圖像,然後在其上呈現透明圖像。然而,libgdx以某種方式替換了我的幀緩衝區上的目的地阿爾法。所以當我將它重新渲染回緩衝區時,它仍然是透明的。這是我的代碼Libgdx/Opengl alpha混合(結果alpha被替換爲源alpha)

@Override 
public void draw(Batch batch, float alpha){ 
    if(enabled){ 
     batch.end(); 

     batch.enableBlending(); 
     batch.begin(); 
     frameBuffer.begin(); 
     Gdx.gl.glClear(Gdx.gl10.GL_COLOR_BUFFER_BIT); 
     Gdx.gl.glClearColor(0, 0, 0, 0); 
     super.draw(batch, alpha); 
     frameBuffer.end(); 
     batch.end(); 

     frameBuffer.getColorBufferTexture().bind(); 

     shader.begin(); 
     setUniforms(); 

     Gdx.gl.glEnable(Gdx.gl20.GL_BLEND); 
     Gdx.gl.glBlendFunc(Gdx.gl10.GL_SRC_ALPHA, Gdx.gl10.GL_ONE_MINUS_SRC_ALPHA); 
     mesh.render(shader, GL10.GL_TRIANGLES); 
     shader.end(); 


     batch.begin(); 
    }else{ 
     super.draw(batch, alpha); 
    } 
} 

這是一個自定義組。首先,我將孩子渲染到frameBuffer,然後綁定它並將其渲染爲真實的後臺緩衝區,但是結果不正確。

這是它應該如何看

綠色背景圖像渲染後的第一背緩衝區。然後,我的發佈進程actor試圖將其餘的場景渲染到它的頂部。

鎖定徽章(高級聯盟等)上有一個半透明的圖像。使用我的着色器,該透明圖像將替換alpha結果,從而出現此問題。 (Backbuffer沒有alpha通道,所以結果alpha始終爲1,但alpha混合仍然打開,因此它可以混合圖像。)

我錯過了什麼?我想我的混合函數,而渲染frameBuffer應該是這樣的。

result_color = src_color*src_alpha + dst_color*(1-src_alpha) 
result_alpha = max(src_alpha, result_alpha) 

回答

1

我想我找到了一個解決方案,glBlendFuncSeperate做我想做的。它可以爲不同的照片提供不同的混合模式。我正在使用這個

 Gdx.gl20.glBlendFuncSeparate(
       Gdx.gl10.GL_SRC_ALPHA, Gdx.gl10.GL_ONE_MINUS_SRC_ALPHA, 
       Gdx.gl10.GL_ONE, Gdx.gl10.GL_ONE);