簡體   English   中英

OpenGL ES 2.0渲染透明背景紋理

[英]OpenGL ES 2.0 render to texture with transparent background

我想創建一個交互式2D效果,可以在任何物體上使用。 因此,我想采用一種幾乎透明的效果,將其渲染為紋理,然后將其放置在我想要的任何地方,只需將其放在正方形上即可。

我遇到的問題是我無法擺脫背景色。 將效果放在對象上時,效果的背景色會遮擋要放置效果的對象。

這是我的代碼。 誰能告訴我我所缺少的嗎?

畫畫:

GLES20.glClearColor(0.6f, 0.34f, 0.14f, 0.0f);
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);

ball.draw();  //This is the object a simple square draw with 2 triangles
particleSystem.renderToTexture(); //effect rendering to texture and drawing it

渲染到紋理的代碼如下:

public void renderToTexture(){
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[0]);
    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTex[0], 0);
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_RENDERBUFFER, depthRb[0]);
    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);

    drawRender();  //draws the effect on a fbo and saving the texture to renderTex[0]

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTex[0]);
    drawEffect(); //draws a square with the effect texture on it

問題應該在這里的某個地方,但我不知道該怎么辦。 我嘗試了所有我能想到的。 我什至傾向於在着色器中處理背景色。

發布的代碼看起來很好。 您將需要確保用於彩色渲染目標( renderTex[0] )的紋理具有alpha分量。

請注意,ES 2.0中保證可以呈現顏色的紋理格式的數量非常有限。 僅有兩個具有alpha分量(請參見規范中的表4.5)的是GL_RGBA4GL_RGB5_A1 最值得注意的是,這並不包括GL_RGBA每個組件8位。

因此,對於要確保可在所有ES 2.0實現中使用的帶有alpha組件的顏色可渲染紋理,您必須對內部格式使用GL_RGBA ,對glTexImage2D()的類型參數使用GL_UNSIGNED_SHORT_4_4_4_4GL_UNSIGNED_SHORT_5_5_5_1

大多數常見設備(至少我所見的設備)確實支持OES_rgb8_rgba8擴展,該擴展增加了對8位組件紋理渲染的支持。 但是,如果要完全可移植,則應在使用具有這些格式的渲染目標之前檢查此擴展程序是否存在。

我知道這個問題很舊,但是我現在也遇到了,對我來說解決方案是使用GLSurfaceView做一些事情。 只需在設置上下文后添加這些行

glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 0, 0);
glSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);

我已經在使用GL_RGBA格式,真的很煩惱其他任何東西都沒有用,但這就像魔術一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM