Lighting Estimation API 可分析给定图像的离散视觉提示,并提供有关给定场景中光线的详细信息。然后,您可以在渲染虚拟对象时使用这些信息,以便在与放置这些场景的场景相同的光照条件下进行渲染,从而使这些对象看起来更加真实,并增强了用户的沉浸式体验。
照明提示和概念
人类会在不知情的情况下察觉到一些微妙的线索,来判断物体或生物是如何在其环境中亮起的。当虚拟对象缺少阴影或闪亮的材料无法反射周围空间时,用户会感觉到对象不太适合特定场景,即使他们无法解释原因也是如此。正因如此,渲染 AR 对象以匹配场景中的光线对于打造沉浸式和更逼真的体验至关重要。
照明估算功能提供了详细的数据,让您能够在渲染虚拟对象时模仿各种照明线索,从而为您完成大部分工作。这些提示包括阴影、环境光、阴影、镜面高光和反射。
我们可以这样描述这些视觉提示:
环境光。环境光是来自环境的整体漫射光,会照亮一切对象。
阴影。阴影通常具有方向性,会告诉观看者光源来自哪里。
阴影。阴影是给定图片不同区域的光线强度。例如,同一对象的不同部分可以在同一场景中使用不同的阴影级别,具体取决于相对于查看者的角度及其与光源的接近程度。
镜面高光。这些是可直接反射光源的闪亮表面。对象的突出显示方式相对于查看者在场景中的位置变化。
思考。光线从表面呈现不同的效果,具体取决于表面是反射性(即反射性强)还是漫射(非反射)属性。例如,金属球将具有高度镜面反射并反映其环境,而另一个球体则采用哑光灰色进行漫射处理。现实世界中的大多数对象都具有这些属性的组合 - 例如,打乱了的保龄球或一种常用的信用卡。
反射面还会从环境环境中选取颜色。对象的颜色可能直接受其所在环境的颜色的影响。例如,蓝色房间中的白色球会呈现蓝色。
使用光估测模式来提升真实性
Config.LightEstimationMode
API 具有多种模式,可以在不同的粒度和真实度下估算环境中的光照。
环境 HDR 模式 (
ENVIRONMENTAL_HDR
):此模式由一个 API 组成,可用于针对定向光照、阴影、镜面高光和反射进行逼真的光照估算。环境强度模式 (
AMBIENT_INTENSITY
):此模式会确定指定图片的平均像素强度和颜色。在没有精确光照的用例(例如具有烘焙光照的物体)下使用的粗略设置。DISABLED
。如果光照与给定环境匹配,则停用Config.LightEstimationMode
。该场景与场景或对象无关。
正在使用“ENVIRONMENTAL_HDR
”模式
ENVIRONMENTAL_HDR
模式使用机器学习技术来分析输入相机图像并合成环境光,以呈现虚拟对象。
此模式结合了方向光、环境球谐波和 HDR 立方体贴图,让虚拟对象看起来就像是物理场景的一部分:
定向光照分析指定图像的视光光源。这种光照会添加合理定位的镜面高光,并从与其他可见真实对象一致的方向投射阴影。
环境球形谐波可真实反映场景各个方向传入的整体环境光。在渲染过程中,此信息将用于添加细微的提示,从而呈现虚拟对象的定义。
HDR 立方体地图会捕获虚拟对象周围的环境光照。在渲染期间,此立方体贴图会为中高光泽材料创建反射。
下图显示了一个虚拟场景,场景放置在启用了 ENVIRONMENTAL_HDR
的场景中。
为 Sceneform 场景配置 ENVIRONMENTAL_HDR
模式
如需将 ENVIRONMENTAL_HDR
与 Sceneform 场景搭配使用,请扩展 ARFragment
类,并按如下方式替换配置:
@Override
protected Config getSessionConfiguration(Session session) {
Config config = new Config(session);
config.setLightEstimationMode(Config.LightEstimationMode.ENVIRONMENTAL_HDR);
return config;
}
要查看运作原理的示例,请参阅太阳系示例。(此示例在不使用 ARFragment
的情况下实现 ENVIRONMENTAL_HDR
。)
正在使用“AMBIENT_INTENSITY
”模式
AMBIENT_INTENSITY
模式决定了给定图片的平均像素强度和颜色校正标量。在没有精确光照(例如具有烘焙光照的物体)的用例下,这是一种粗略的设置。
像素强度会捕获场景中光线的平均像素强度,用于应用到整个虚拟对象。
色彩校正标量会检测每个帧的白平衡,并允许您为虚拟对象着色,以使其更顺畅地集成到场景的整体颜色中。
为 Sceneform 场景配置 AMBIENT_INTENSITY
模式
如需将 AMBIENT_INTENSITY
与 Sceneform 场景搭配使用,请扩展 ARfragment
类,并按如下方式替换配置:
@Override
protected Config getSessionConfiguration(Session session) {
Config config = new Config(session);
config.setLightEstimationMode(Config.LightEstimationMode.AMBIENT_INTENSITY);
return config;
}