如何使用原生EGL制作透明的SurfaceView?

时间:2018-04-16 02:57:05

标签: android android-ndk surfaceview egl

我想在相机SurfaceView上叠加抽屉,如下所示:

onActivate

现在,我无法使抽屉层透明化。

1。将SurfaceView设置为顶部。并将格式设置为RGBA_8888 / TRANSLUCENT / TRANSPARENT,并选择带有EGL_ALPHA_SIZE的配置。

UI Layer(RGBA)
--------
Drawer Layer(RGBA\GLES)
--------
Camera Layer

然后选择配置为EGL_ALPHA_SIZE。

setZOrderOnTop(true); //try setZOrderMediaOverlay, too.
getHolder().setFormat(PixelFormat.RGBA_8888);

我有一个黑色的背景。相机层未显示。

2。基于 1 ,将{EGL_TRANSPARENT_TYPE,EGL_TRANSPARENT_RGB}添加到eglconfig

const EGLint attribs[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
                          EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
                          EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
                          EGL_BLUE_SIZE, 8,
                          EGL_GREEN_SIZE, 8,
                          EGL_RED_SIZE, 8,
                          EGL_ALPHA_SIZE, 8,
                          EGL_DEPTH_SIZE, 16,
                          EGL_NONE
};
//...
glClearColor(1,1,1,0);

selectConfig中的EGL Init失败。 然后我打印所有的egl配置,没有一个有{EGL_TRANSPARENT_TYPE,EGL_TRANSPARENT_RGB}。

我已经解决了。只需将glClearColor更改为

即可
const EGLint attribs[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
                          EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
                          EGL_TRANSPARENT_TYPE,  EGL_TRANSPARENT_RGB,
                          EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
                          EGL_BLUE_SIZE, 8,
                          EGL_GREEN_SIZE, 8,
                          EGL_RED_SIZE, 8,
                          EGL_ALPHA_SIZE, 8,
                          EGL_DEPTH_SIZE, 16,
                          EGL_NONE
};
//...
glClearColor(1,1,1,0);

似乎GL帧缓冲区中的Alpha通道已被igonred。可能是Android使用ADD而不是ONE_MINUS_SRC来混合Windows吗?有人能解释清楚吗?

0 个答案:

没有答案