2014-09-02 156 views
1

我想创建一个交互式2D效果,我可以放在任何东西上。所以我想采取一种基本透明的效果,将其渲染为纹理,并将其放在任何我想要的地方,只需将其放在方形上即可。OpenGL ES 2.0渲染到具有透明背景的纹理

我遇到的问题是我无法摆脱背景颜色。当我将效果放在对象上时,效果的背景颜色会遮挡我想要放置效果的对象。

这是我的代码。有人可以告诉我我错过了什么吗?

图:

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 

的问题应该是这里的某个地方,但我不知道该怎么办。我尝试了所有我能想到的。我甚至愿意在着色器中处理背景颜色。

+1

这看起来很好,所以问题很可能在代码中的其他地方。你用作framebuffer附件('renderTex [0]')的纹理是什么格式?确保您使用带有alpha组件的格式。其他可能的问题可能是用于'renderToTexture()'的清晰颜色,或用于'Drawing()'的片段着色器。 – 2014-09-02 14:20:02

+0

@ReetoKoradi thaaank youu。我非常喜欢这个:GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_RGB,texW,texH,0,GLES20.GL_RGB,GLES20.GL_UNSIGNED_SHORT_5_6_5,null); Ofc它没有显示任何透明度 – FaNaT 2014-09-02 15:05:31

回答

1

发布的代码看起来非常好。您需要确保用于颜色渲染目标(renderTex[0])的纹理具有alpha分量。

请注意,ES 2.0中保证可呈现颜色的纹理格式数量非常有限。只有两个alpha组件(参见规范中的表4.5)是GL_RGBA4GL_RGB5_A1。最值得注意的是,这不包括而不是包括GL_RGBA每个组件8位。

所以用于定义色渲染的纹理与阿尔法分量即保证跨所有ES 2.0实现方式工作,你将不得不使用GL_RGBA的内部格式,和GL_UNSIGNED_SHORT_4_4_4_4GL_UNSIGNED_SHORT_5_5_5_1用于glTexImage2D()类型参数。

最常见的设备(至少我见过的所有设备)都支持OES_rgb8_rgba8扩展,它增加了对渲染到8位组件纹理的支持。但是如果你想完全移植,你应该在使用这些格式的渲染目标之前检查这个扩展的存在。

+0

我很伤心,与GL_RGBA我的效果甚至不像RGB那样漂亮,GL_UNSIGNED_SHORT_5_6_5和其他两个回黑屏 – FaNaT 2014-09-02 22:10:51

+0

你会如何检查存在的OES_rgb8_rgba8? – David 2015-11-17 16:45:36

0

我知道这个问题很老,但我现在也遇到了,我的解决方案是用GLSurfaceView做些事情。只需添加这些行

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

我已经使用GL_RGBA格式,真的恼火,没有别的工作设置上下文之后,但这个工作就像魔术。