我想在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)