Poi*_*ull 10 android background transparent opengl-es-2.0
我尝试使用GLSurfaceView进行渲染,并通过文档设置格式:
getHolder().setFormat(PixelFormat.TRANSLUCENT);
Run Code Online (Sandbox Code Playgroud)
我使用GLSurfaceView.Renderer,它绘制onDrawFrame:
GLES20.glClearColor(0, 0, 1, .5f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
Run Code Online (Sandbox Code Playgroud)
但是,GLSurfaceView中的GL渲染不是半透明的,而是完全蓝色的.如果我省略glClear调用,那么它是全黑的.
如何使GL渲染具有透明背景,以便与后面绘制的视图混合?

编辑:这是我的GLSurfaceView:
class GLView extends GLSurfaceView{
MyRenderer r;
public GLView(Context ctx){
super(ctx);
setEGLContextClientVersion(2);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
r = new MyRenderer(getContext());
setRenderer(r);
}
}
Run Code Online (Sandbox Code Playgroud)
好的,经过一些研究我可以自己回答这个问题.
我终于使用SurfaceView.setZOrderOnTop(true)将其绘制成透明度.但后来我失去了在GLSurfaceView上放置其他视图的可能性.
我结束了两个可能的结果:

左边是所有其他视图下方的标准GL曲面,不能用透明度绘制,因为GL曲面是在应用程序窗口表面之前绘制的,而GLSurfaceView只是在其位置打孔,以便透视GL表面.
右边是用setZOrderOnTop(true)绘制的透明GL表面,因此其表面绘制在应用程序窗口的顶部.现在它是透明的,但是在视图层次结构中放置在其上的其他视图之上绘制.
因此,应用程序似乎有一个窗口,其视图层次结构具有表面,而SurfaceView具有自己的GL表面,可能位于应用程序窗口的顶部或下方.遗憾的是,透明GL视图无法在视图层次结构中正确排序,并且其上包含其他视图.
您需要RGBA 8888像素格式才能实现半透明:
private void init( boolean translucent, int depth, int stencil )
{
/* By default, GLSurfaceView() creates a RGB_565 opaque surface.
* If we want a translucent one, we should change the surface's
* format here, using PixelFormat.TRANSLUCENT for GL Surfaces
* is interpreted as any 32-bit surface with alpha by SurfaceFlinger.
*/
this.getHolder().setFormat( PixelFormat.RGB_565 );
if ( translucent )
{
this.getHolder().setFormat( PixelFormat.TRANSLUCENT );
}
setEGLContextFactory( new ContextFactory() );
/* We need to choose an EGLConfig that matches the format of
* our surface exactly. This is going to be done in our
* custom config chooser. See ConfigChooser class definition
* below.
*/
setEGLConfigChooser( translucent ?
new ConfigChooser( 8, 8, 8, 8, depth, stencil ) :
new ConfigChooser( 5, 6, 5, 0, depth, stencil ) );
setRenderer( new Renderer() );
}
Run Code Online (Sandbox Code Playgroud)