[英]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_RGBA4
和GL_RGB5_A1
。 最值得注意的是,這並不包括GL_RGBA
每個組件8位。
因此,對於要確保可在所有ES 2.0實現中使用的帶有alpha組件的顏色可渲染紋理,您必須對內部格式使用GL_RGBA
,對glTexImage2D()
的類型參數使用GL_UNSIGNED_SHORT_4_4_4_4
或GL_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.