使用Filament在ARCore中创建AR世界空间UI元素的最佳方法是什么
基于Filament + ARCore实现世界空间UI的可行方案
方案1:使用Filament内置UI渲染管线
- 优先调用Filament自带的
ui模块,它原生支持2D控件到3D空间的投影转换,不需要手动处理位图渲染逻辑 - 可直接声明文本、按钮、矩形这类基础UI组件,Filament内部会自动处理顶点生成、纹理缓存,不会出现单张位图拉伸模糊的问题
- 对接ARCore时,仅需将UI节点的世界矩阵设置为ARCore锚点输出的变换矩阵即可,坐标对齐无需额外转换
方案2:对接Android View系统的离屏渲染优化方案
如果需要使用Android原生控件能力,可采用非截位图的高性能实现方式:
- 开启View的硬件加速离屏渲染层,拿到
SurfaceTexture直接绑定到Filament的纹理对象,不需要做任何像素拷贝操作 - 给View设置刚好匹配控件大小的最小尺寸,调用
setLayerType(LAYER_TYPE_HARDWARE, null),更新频率和Filament渲染帧同步,仅在控件内容变化时触发重绘,性能损耗极低 - 交互逻辑实现简单:将ARCore触摸射线碰撞到的UI平面坐标,转换成View的本地坐标后直接分发触摸事件给离屏的View实例,和原生控件交互逻辑完全一致
开发注意事项
- Filament的UI节点默认开启相机朝向的公告牌效果,如果你需要固定朝向的世界空间UI,手动关闭
billboard属性即可 - 实现半透明UI时,需将材质的混合模式设置为
TRANSPARENT,提前在渲染队列中排在不透明物体之后,避免alpha混合出现显示错误
内容的提问来源于stack exchange,提问作者Bounty-Torn
相关产品推荐
相关产品推荐

