Android让GLSurfaceView渲染opengl透明

解决GLSurfaceView默认不透明的问题

方案1:

https://blog.csdn.net/flycatdeng/article/details/82668168

    /**
     * <pre>
     *  设置透明背景的方法,根据实际情况,可能setEGLConfigChooser中的alpha可能要设置成0
     *  再者就是这个方法需要在setRenderer之前调用才有效
     * </pre>
     */
    public void setTranslucent() {
        // 设置背景透明,否则一般加载时间长的话会先黑一下,但是也有问题,就是在它之上无法再有View了,因为它是top的,用的时候需要注意,必要的时候将其设置为false
        setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        getHolder().setFormat(PixelFormat.TRANSLUCENT);
        setZOrderOnTop(true);
    }

opengl背景也要画成透明
class MyRenderer : GLSurfaceView.Renderer {

    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
        // 关键:alpha=0,RGB 随意
        GLES20.glClearColor(0f, 0f, 0f, 0f)
    }

GLSurfaceView本身是不透明的,所以需要设置背景透明的话需要在其子类加入上述方法,但是要注意的是其View上加不上其他的View了。

缺点:

改方案会让GLSurfaceView置于顶层,原因是GLSurfaceView会创建一个分离的window,设置了setZOrderOnTop会让它置顶覆盖activity的window

方案2:

https://blog.csdn.net/u010029439/article/details/97164223

TextureView 不会创建一个分离的window,而是像一个普通的view那样显示, 这样就不会像GLSurfaceView那样,要么在所有View上方,要么被其它View遮住(看 setZOrderOnTop(boolean) 的说明)。而且像myView.setAlpha(0.5f)这种方法调用后也会有效果了。

可是TextureView在里面并没有像GLSurfaceView那样封装好一个绘制线程以及OpenGL的初始化。

所以需要网上大神封装好的GLTextureView实现这些部分。

GLTextureView代码:

https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenGL/4.GLTextureView实现.md

GLTextureViews使用方法:

//和GLSufaceView类似:
val view = GLTextureView(
            activity
        ).apply {
            setEGLContextClientVersion(2) // OpenGL ES 2.0を利用
            val _glRenderer = GLRendererMinimum(action)

            // 1. 使用 8888 带 Alpha 的 EGLConfig
            setEGLConfigChooser(8, 8, 8, 8, 16, 0)   // r,g,b,a,depth,stencil
            // 2. 告诉系统是可以(离屏)透明的
            isOpaque = false

            //设置渲染器
            setRenderer(_glRenderer)
            renderMode = GLSurfaceView.RENDERMODE_CONTINUOUSLY
        }

经过这些操作,就可以让opengl的绘制透明,又不置顶,而且可以和普通view一样使用啦

缺点

需要使用网上大神写的GLTextureView,非官方提供,稳定、性能、兼容性有待见验证

posted @ 2025-11-03 09:16  georgeyang  阅读(2)  评论(0)    收藏  举报