Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGL ES 2.0渲染到具有透明背景的纹理_Android_Opengl Es 2.0_Render To Texture - Fatal编程技术网

Android OpenGL ES 2.0渲染到具有透明背景的纹理

Android OpenGL ES 2.0渲染到具有透明背景的纹理,android,opengl-es-2.0,render-to-texture,Android,Opengl Es 2.0,Render To Texture,我想创造一个互动的2D效果,我可以把任何东西。所以我想采取一种基本透明的效果,把它渲染成一种纹理,然后把它放在任何我想要的地方,只要把它放在一个正方形上 我遇到的问题是我无法摆脱背景色。当我将效果放置在对象上时,效果的背景色会遮挡我要放置效果的对象 这是我的密码。谁能告诉我我错过了什么 图纸: GLES20.glClearColor(0.6f, 0.34f, 0.14f, 0.0f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_D

我想创造一个互动的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中保证颜色可渲染的纹理格式数量非常有限。仅有的两个具有阿尔法成分(见规范中的表4.5)是
GL_RGBA4
GL_RGB5_A1
。最值得注意的是,这不包括每个组件8位的
GL_RGBA

因此,对于使用alpha组件定义可保证在所有ES 2.0实现中工作的颜色可渲染纹理,内部格式必须使用
GL_RGBA
,而
GL_UNSIGNED_SHORT_4_4_4_4_4_4
GL_UNSIGNED_SHORT_5_5_5_1
用于
glTexImage2D()的类型参数


大多数常见设备(至少我见过的所有设备)都支持该扩展,它增加了对渲染8位组件纹理的支持。但是,如果您希望完全可移植,在使用这些格式的渲染目标之前,应该检查是否存在此扩展。

我知道这个问题很老,但我现在也遇到了这个问题,我的解决方案是使用GLSURFACHEVIEW。只需在设置上下文后添加这些行

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

我已经在使用GL_RGBA格式了,对于其他格式都不起作用,我感到非常恼火,但这非常神奇。

这看起来不错,所以问题很可能在代码的其他地方。用作帧缓冲区附件的纹理是什么格式(
renderTex[0]
)?确保使用带有alpha组件的格式。其他可能的问题可能是用于
renderToTexture()
的清晰颜色,或用于
Drawing()
@RetoKoradi thaaank youu的片段着色器。我用了这个:GLES20.glTexImage2D(GLES20.GL_纹理_2D,0,GLES20.GL_RGB,texW,texH,0,GLES20.GL_RGB,GLES20.GL_无符号_SHORT_5_6_5,null);Ofc它没有显示任何透明度我很难过,有了GL_RGBA,我的效果甚至不像RGB和GL_UNSIGNED_SHORT_5_6_5和其他两个都会返回黑色屏幕,你如何检查OES_rgb8_rgba8的存在?