版权声明:Davidwang原创文章,严禁用于任何商业途径,授权后方可转载。
(一)光照一致性
AR 与 VR 在光照上最大的不同在于 VR 世界是纯数字世界,有一套完整的数学模型,而 AR 则是将计 算机生成的虚拟物体或关于真实物体的非几何信息叠加到真实世界的场景之上实现对真实世界的增强,融 合了真实世界与数字世界。就光照而言,VR 中的光照完全由开发人员决定,光照效果是一致的,而 AR 中 则不得不考虑真实世界的光照信息与虚拟的 3D 光照信息的一致性,比如说,如果在 AR 3D 应用中设 置了一个模拟太阳的高亮度方向光,而用户是在晚上使用这个 AR 应用,如果不考虑光照一致性,那么渲染 出来的虚拟物体的光照与真实世界其他物体的光照反差将会非常明显,由于人眼对光照信息的高度敏感, 这种渲染可以说是完全失败的,完全没有沉浸感。在 AR 中,由于用户与真实世界的联系并未被切断,光照 的交互方式也要自然,如果真实世界的阴影向左而渲染出来的虚拟物体阴影向右,这也是让人难以接受的, 所以在 AR 中,必须要能达到虚拟光照与真实光照的一致,虚拟物体渲染出来的阴影应与真实环境中的阴影基本保持一致,这样才能提高虚拟物体的可信度和真实感。
光照一致性,是指让虚拟物体具有与真实场景相同的光照效果。光照一致性的目标是使虚拟物体的光 照情况与真实场景中的光照情况一致,虚拟物体与真实物体有着一致的明暗、阴影效果,以增强虚拟物体 的真实感。解决光照一致性问题的关键是如何获取真实场景中的光照信息,准确的光照信息能够实现更加 逼真的增强现实效果。光照一致性包含的技术性问题很多,完全的解决方案需要场景精确的几何模型和光 照模型,以及场景中物体的光学属性描述,这样才可能绘制出真实场景与虚拟物体的光照交互,包括真实 场景中的光源对虚拟物体产生的明暗、阴影和反射以及虚拟物体对真实物体的明暗、阴影和反射的影响。 光照一致性问题是增强现实技术中的一个难点,光照模型的研究是解决光照一致性问题的重要手段,其主 要研究如何根据物理光学的有关定律,采用计算机来模拟自然界中光照的物理过程。 由于光照一致性涉及的问题很多,实现虚实场景的一致性光照,一个关键的环节是要获取现实环境中 真实光照的分布信息。目前对真实环境光照的估计方法主要包括:借助辅助标志物的方法、借助辅助拍摄 设备的方法、基于图像的分析方法等等。在下图中,我们利用光照估计技术评估环境光,利用环境光中的光照信息来动态调整虚拟对象的光照效果。
(二)光照估计操作
为在ARFoundation中应用光照估计,我们首先要打开ARFoundation光照估计功能,在Hierarchy窗口中,依次选择AR Session Origin->AR Camera,然后在Inspector窗口的AR Camera Manager组件中,选择其Light Estimation Mode为“Ambient Intensity”,如下图所示。
新建一个C#脚本,命名为LightEstimation,编写如下代码。
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class LightEstimation : MonoBehaviour
{
[SerializeField]
private ARCameraManager mCameraManager;
private Light mLight;
void Awake()
{
mLight = GetComponent<Light>();
}
void OnEnable()
{
if (mCameraManager != null)
mCameraManager.frameReceived += FrameChanged;
}
void OnDisable()
{
if (mCameraManager != null)
mCameraManager.frameReceived -= FrameChanged;
}
void FrameChanged(ARCameraFrameEventArgs args)
{
if (args.lightEstimation.averageBrightness.HasValue)
{
mLight.intensity = args.lightEstimation.averageBrightness.Value ;
Debug.Log("Light Intensity:"+args.lightEstimation.averageBrightness.Value);
}
if (args.lightEstimation.averageColorTemperature.HasValue)
{
mLight.colorTemperature = args.lightEstimation.averageColorTemperature.Value;
Debug.Log("Light Color Temperature:"+args.lightEstimation.averageColorTemperature.Value);
}
if (args.lightEstimation.colorCorrection.HasValue)
{
mLight.color = args.lightEstimation.colorCorrection.Value
Debug.Log("Light Color Correction:" + args.lightEstimation.colorCorrection.Value );
}
}
}
为应用该脚本,我们将该脚本挂载在场景中的Dierctional Light对象上,并将AR Session Origin->AR Camera赋给脚本的mCameraManager属性,如下图所示。
编译运行,Debug输出如下图所示,通过观察我们发现三件事实:一是Light Color Temperature没有输出;二是Light Color Correction值非常接近于1,Light Intersity的值只有Light设定值的一半左右;三是光照估计每帧都会执行。
出现事实一的原因是我们使用的手机操作系统平台为Android,在Android平台上使用的ARCore没有Light Color Temperature的概念。在ARCore中,光照估计会对环境中的光照强度(Intensity)、颜色(Color)、方向(Direction)进行评估计算,在ARFoundation中,计算了光照强度(Intensity)、颜色校正(Light Color Correction)。在iOS平台上使用ARKit时没有Light Color Correction的概念,ARKit只对环境中的光照强度(AmbientIntensity)、颜色色温(AmbientColorTemperature)进行估计,因此在iOS平台,Light Color Correction也将不会输出。
通过事实二我们也可以看到,在实际应用中,颜色校正值其实是比较微弱的;同时我们也可以到了光照强度大概率在0.4-0.5之间浮动,因此有时为了让效果再明显,我们会乘一个系统来对强度、颜色值进行纠偏,例如乘以2扩大影响范围。
ARCore与ARKit的光照估计技术都是建立在图像分析方法基础之上的综合技术,使虚拟物体能够根据环境光照信息 改变光照情况,增加虚拟物体在现实世界中的真实感。基于图像的光照估计算法需要对摄像头获取的每一帧图像的每一个像素点进行数学运算,因此计算里非常大,因此,如果在不需要光照估计时应该及时的关闭光照估计。关闭光照估计的方法是选择场景AR Session Origin->AR Camera对象,将其AR Camera Manager组件中的Light Estimation Mode设为“Disable”。
下图是在同一光照条件下,我们通过更换不同的背景模拟环境光改变,虚拟物体光照也发生了比较明显的变化(为强化效果,我们将Color Correction乘了系数5)。