GLSurfaceView - 如何制作半透明背景

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)

Poi*_*ull 7

好的,经过一些研究我可以自己回答这个问题.

我终于使用SurfaceView.setZOrderOnTop(true)将其绘制成透明度.但后来我失去了在GLSurfaceView上放置其他视图的可能性.

我结束了两个可能的结果:

背后 在上面

左边是所有其他视图下方的标准GL曲面,不能用透明度绘制,因为GL曲面是在应用程序窗口表面之前绘制的,而GLSurfaceView只是在其位置打孔,以便透视GL表面.

右边是用setZOrderOnTop(true)绘制的透明GL表面,因此其表面绘制在应用程序窗口的顶部.现在它是透明的,但是在视图层次结构中放置在其上的其他视图之上绘制.

因此,应用程序似乎有一个窗口,其视图层次结构具有表面,而SurfaceView具有自己的GL表面,可能位于应用程序窗口的顶部或下方.遗憾的是,透明GL视图无法在视图层次结构中正确排序,并且其上包含其他视图.

  • 我无法给出自己的答案,其他答案也不能让我满意. (2认同)

Ser*_* K. 5

您需要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)