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,非官方提供,稳定、性能、兼容性有待见验证

浙公网安备 33010602011771号