解决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
解决方式
一句话,就是采用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”中查看