今天的任务是为虚拟物体添加光照一致性的效果,使其在现实中看起来更加自然一些。
ARCore关于光照估计的计算程序都放在环境光预制物的脚本上
这个脚本实现了有关光照强度估计以及光照方向估计相关的多种内容。
这部分其实一开始我在实现的时候参考了一下文章的内容
ARCore之路-光估计之光照强度估计
又是分析了EnvironmentalLighe脚本的内容并复习了Blinn-Phong光照模型,又是学习了shader并写出相关的着色器代码。
不知道是不是因为文章中ARCore的版本比较旧,需要很麻烦的方法实现光照强度估计的计算。
但是最新版本的ARCore已经将这部分内容计算好并提供给用户使用。
分析一下代码:
ARcore通过计算现实环境中的光照强度以及光照方向,然后改变DirectionalLight的参数,于是虚拟物体就可以被unity基于DirectionalLigh进行光照渲染,实现光照一致性。
初次之外,需要一个shader来模拟物体表面的漫反射光
代码:
Shader “DiffuseWithLightEstimation”
{
Properties
{
_MainTex (“Base (RGB)”, 2D) = “white” {}
}
SubShader
{
Tags { “RenderType”=“Opaque” }
LOD 150
CGPROGRAM
#pragma surface surf Lambert noforwardadd finalcolor:lightEstimation
sampler2D _MainTex;
fixed3 _GlobalColorCorrection;
struct Input
{
float2 uv_MainTex;
};
void lightEstimation(Input IN, SurfaceOutput o, inout fixed4 color)
{
color.rgb *= _GlobalColorCorrection;
}
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
Fallback “Mobile/VertexLit”
}
效果对比:
另外说一下。由于ARCore仅支持部分手机设备
支持的设备
而我的手机并不支持ARCore,因此在借手机这方面需要下点功夫,并不是随时都有手机能进行开发。