解决Filament中使用ARCore出现绿色闪屏的问题
解决Filament中使用ARCore出现绿色闪屏的问题
问题现象
使用AR的工程中,出现绿屏闪烁。问题帧截图如下:
问题定位
问题来源
在filament的1.21.0之前的版本,Stream对象提供了stream(long externalTextureId)方法,允许传递一个纹理ID,之前是通过如下方式实现AR功能。
// Create the filament stream.Stream stream =new Stream.Builder().stream(textureId).width(width).height(height).build(engine);initialize(stream);
而在1.21.0之后的版本,stream(textureId)方法已过时,官方推荐采用Texture对象的importTexture的方式去加载。故修改成如下内容
filamentTexture = new Texture.Builder().sampler(Texture.Sampler.SAMPLER_EXTERNAL).importTexture(textureId).build(engine.getFilamentEngine());
实测,也能运行,但是偶现绿屏。
解决方案
Issue链接
解决前,找了下Issues,发现以前有人解决过。
Issue的提出者是ThomasGorisse
ThomasGorisse 是sceneview仓库的贡献者,继20年sceneform存档以后,他先后维护了sceneform、sceneview。
Texture from a GLuint texture ID #5513
green flickering and laggy camera stream in android #5498
解决方式
一句话,就是采用SAMPLER_2D 类型替换SAMPLER_EXTERNAL类型。
具体步骤
1、重新编译材质
为实现AR的功能,此前我们用了一个材质文件,用于关联相机视频流。
此时,我们需要修改材质文件,并重新编译。
将‘samplerExternal’修改为‘sampler2d’
旧材质
material {name : flat,shadingModel : unlit,blending : opaque,parameters : [{type : samplerExternal,name : cameraTexture},{type : float4x4,name : uvTransform}],requires : [uv0]
}
......
新材质
material {name : flat,vertexDomain : device,shadingModel : unlit,blending : opaque,culling : none,parameters : [{type : sampler2d,name : cameraTexture},{type : float4x4,name : uvTransform}],requires : [uv0]
}
...
2、使用SAMPLER_2D类型
filamentTexture = Texture.Builder().width(resolution.width).height(resolution.height).levels(1).sampler(Texture.Sampler.SAMPLER_2D).format(Texture.InternalFormat.RGBA8).importTexture(externalTextureId.toLong()).build(filamentEngine)
更多代码可转至开源项目“Sceneform-EQR”中查看