虚拟物体为什么看起来真实?很大程度是因为光照。现实中光源的方向、色温、高光等条件,会改变物体的外观,有光感明暗交错,有阴影,一个物体才能看上去真实。因此模拟现实环境中的光照感觉,是 AR 物体栩栩如生的关键。
光估测的概念就是提供对现实环境的光照分析,将现实世界的光照感觉拓展到数字场景中。光估测 API 通过分析给定图像的离散视觉提示,获得特定场景的光照信息,ARCore 再使用这些信息对同一场景下的虚拟对象进行渲染与照明,增加物体的真实感,达到虚实交融效果。
光照因素与概念
当虚拟物体缺少阴影或表面的闪光材质不能反射出周围环境时,即使用户说不出具体原因,也觉得物体不太真实。所以想提升 AR 的沉浸式和真实感,渲染 AR 物体与场景光匹配至关重要。
光估测通过采样并分析大量详细数据,为开发者解决了以上难题。这些数据可以允许你在渲染虚拟对象时重现各种光照信息,其中包括阴影、环境光、明暗变化、镜面高光与反射。
以上这些光照信息名词,可参照以下解释:
环境光(Ambient Lighting):环境光是来自周围环境整体的散射光,为处于环境中的所有物体提供照明。
阴影(Shadow):光影通常具有方向性,也指向了光源方向。
明暗变化(Shading):是特定图像在不同区域展现出来的不同的光的明暗度。举个例子,同一个物体在同一个场景中,表面光的情况也会随着观察者角度的变化、环境光强度的变化而变化。
镜面高光(Specular highlight):通过直接光源的照射,物体表面会反射高光点。这种物体表面的高光会随着观察者的位置而发生变化。
反射(Reflection):光的反射会根据物体表面是否具有镜面或漫反射的特性而略有不同。例如,一个金属球将具有较高的镜面反射能力,并映出周围环境中的事物。相反,如果球的表面是磨砂材质,灰色,则照到球表面上的光会被散射。现实生活中的很多物体通常兼具镜面反射和漫反射特点,比如一个磨损的保龄球、一张使用很久的信用卡。
有反射能力的物体表面通常还会映射出周围环境的颜色。经过反射后,物体表面呈现的颜色会直接受到周围环境的影响。比如,一个白色的球放置在蓝色的环境中,它的表面也会泛出蓝色。
光估测模式
光估测 API 有多种模式,可以根据不同程度的颗粒度与逼真度来对环境中的光进行估算。
环境 HDR 模式(Environmental HDR modes)(EnvironmentalHDRWithReflections 和 EnvironmentalHDRWithoutReflections)。这些模式是由多个分开的 API 组合而成,可以对直接光源、光影、镜面高光、反射进行颗粒度与逼真度估算。
环境强度模式 (Ambient Intensity mode)(AmbientIntensity)该模式将决定给定图像的平均像素亮度以及光照颜色。这只是一个粗略设置,用于无需精准照明的物体,例如自带烘培光照信息的物体。
禁用(Disabled)。当需匹配的光与给定虚拟场景或虚拟物体不相关时,请禁用光估测模式。
注意 :当你的 App 使用光估测模式时,只有光的强度或设备位置发生重大改变时才会触发更新效果。
使用环境 HDR 模式
Environmental HDR modes
这些模式将运用机器学习来分析输入的相机画面并生成环境光信息,以供虚拟物体渲染。
EnvironmentalHDRWithReflections(带反射的环境 HDR 模式) 由三个 API 组成:主定向光、环境球谐光照以及 HDR 立方体贴图。这些 API 可以实现细腻和逼真度的光估测。此模式最适合用于对有高反射镜面物体的场景进行光估测,这样的场景中,物体会镜面反射周围环境。
EnvironmentalHDRWithoutReflections (不带反射的环境 HDR 模式)与EnvironmentalHDRWithReflections(带反射的环境 HDR 模式) 大致相同,唯一不同的是后者不调用 HDR 立方体贴图 API。这种光估测模式主要适用于表面无法映射周围环境的物体,比如暗淡哑光材质物体。
注意 :默认情况下,这些 API 中的功能是使用 ARCore SDK for Unity 中包含的 Environmental Lighting prefab 进行配置的。有关使用此预制件、配置以及与光估测有关的其他设置的详细信息,请参阅《 Lighting Estimation Unity 开发人员指南》,文末有链接。
主定向光
Main directional light
主定向光 API 判断出给定场景中主光源的位置与强度,你可以通过 DirectionalLightRotation 以及 DirectionalLightColor 进行获取。
此信息允许场景中的虚拟对象显示出位置合理的镜面高光,并沿与其他可见真实对象一致的方向投射阴影。
想了解它的工作原理,请看下图。
这是两个相同的虚拟火箭。左图中,火箭下方有一个阴影,其方向与其他的阴影方向不一致。反观右图,火箭的阴影方向与其他阴影方向完全一致。两张图的差别虽然很细微,却是至关重要的。因为当火箭的阴影方向与环境中其他物体的阴影方向一致时,才能达到火箭真的放置在地上的效果,增加数字对象在现实环境中的真实性。
当主光源或被照明对象发生移动时,物体表面的镜面高光会实时改变其相对于光源的位置。
与在现实世界中一样,定向阴影也会随着主光源的改变实时调整影子的长度和方向。想要深入理解这个概念,来看下面两个自然光中的模特,你能分清哪个是真实模特,哪个是虚拟模特吗?
上面两张图中,左边的模特是虚拟物体
环境球谐光照
Ambient spherical harmonics
通过使用 AmbientProbe,ARCore 可以逼真的表示出给定场景中不同方向的环境光。你可以在数字对象的渲染过程中运用这些信息,让虚拟物体看起来更加逼真。
为了让这一特效更好理解,我们还是用相同的火箭模型来举例。下面两幅图中,左边的光估测信息是通过主定向光 API 采集到的。而右侧图片中的数字对象,是通过主定向光 API 和环境球型谐波 API 共同采集与实现的。相比较而言,右侧图中的火箭模型视觉清晰度更高,与周围环境的完美贴合为用户提供了更好的视觉体验。
为了获取理想的光估测条件,请使用 EnvironmentalHDRWithReflection 激活 HDR 立方体贴图。
HDR 立方体贴图
HDR cubemap
HDR 立方体贴图 API 可以检测光估测数据,帮助你将真实反射渲染到现实环境中的虚拟物体上。
当你使用这个 API 时,ReflectionProbe 将会获取已采集虚拟物体环境光的立方体贴图。在渲染的过程中,这个立方体贴图会对中高光泽度的材质创建反射。
在这个图片中,渲染数字对象前,环境 HDR 模式的三个 API 都用来辅助数字对象的渲染启用。其中 HDR 立方体贴图使得材质表面看起来更有反射感,并且更进一步的把虚拟物品融入在场景里面。
使用立方体贴图会对应用的计算量有少许增加。一个物体表面的材质会产生镜面反射还是漫反射决定了它将如何反射周围的环境,也因此决定了 HDR 立方体贴图是否值得被使用。因为我们的虚拟火箭表面材料是金属,具有强烈的镜面反射能力来反射周围环境,所以启用立方体贴图将为虚拟火箭的渲染效果增色不少。相反,如果虚拟物体是灰色磨砂材质,不具有镜面反射能力,即使启用立方体贴图也无太大用武之地,因为它的颜色更多的是由漫反射成分决定。
立方体贴图还会影响物体的明暗与外观颜色。例如,具有镜面反射能力的物体被蓝色环境包围时,其表面也将反射出蓝色。
下面我们再看其他示例。
下图是在不同光照环境下的同一枚火箭模型。所有这些场景都是通过三个 API 渲染得出的,并使用了定向阴影。
使用“环境强度”模式
Using AmbietIntensity mode
“环境强度”(AmbientIntensity)模式会确定给定图像的平均像素强度与颜色校正参数。这只是一个粗略的设置,用于无需精准照明的物体,例如自带烘培光照信息的物体。
*像素强度(PixelIntensity)。使用环境强度 API 时,PixelIntensity()会捕捉场景中光的平均像素强度。你可以将这一强度值用于照明整个虚拟物体
*颜色。当你使用环境强度 API 时,ColorCorrection()会检测每一帧的白平衡,进而您可以对虚拟物体进行颜色校正,使虚拟物体与周围环境的颜色完美贴合。
注意:默认情况下,这些 API 中的功能使用默认的 Session Config 中的“光估测模式”实现配置。有关其详细信息,请参见《Lighting Estimation Unity 开发人员指南》。
光估测 API
https://developers.google.cn/ar/reference/unity/namespace/GoogleARCore#lightestimationmode
《Lighting Estimation Unity 开发人员指南》
https://developers.google.cn/ar/develop/unity/light-estimation/developer-guide-unity
想获取更多 ARCore 技术资讯,请关注谷歌开发者菜单 - 开发技术- ARCore 专区。