A fantastic demo from Sander Sneek

① Light Estimation & Sun Direction (环境光与日照方向)
② Realtime Reflection (环境色反射)
③ Real-time Shadow (实时影子,URP)
④ Real-time Shadow (实时影子,BRP)
⑤ Post-processing(屏幕特效,BRP)
⑥ Post-processing(屏幕特效,URP)

① Light Estimation & Sun Direction (环境光与日照方向)

  1. 置入 LightEstimation.cs
  2. 赋予Directional Light 并设置 Directional Light > Shadow: Soft Shadow
  3. 将AR Camera>AR Camera Manager: Light Estimation Mode 设置为 Ambient Intensity
  4. 将AR Camera 拖拽入Camera Manager

“LightEstimation.cs” can be found here in Unity’s ARFoundation Github

② Realtime Reflection (环境色反射)

  1. AR Session Origin>Add Component>AR Environment Probe Manager

③ Real-time Shadow (Tutorials here for AR Shadows in Light Weight Render Pipline which now calls Universal Render Pipline)

  1. Asset 文件夹中 Create > Shader > Standard Surface Shader 并替换成上述内容
  2. Asset 文件夹中 Create > Material: Shader 改为 AR Proxy
  3. Hierarchy中 Create > XR > AR Default Plane 并赋予上述Material 拖拽到 Asset 文件夹中生成 Prefab
  4. 删除 Hierarchy中的 AR Default Plane
  5. 选中 AR Session Origin 将 AR Default Plane 拖拽到 AR Plane Manager (Script): Plane Prefab 中
  6. 阴影精度在 LightweightRenderPiplineAsset > Shadows 中调整
// (c) 2020 Tongzhou Yu
// Ref. https://forum.unity.com/threads/configuring-ar-foundation-3-0-0-preview-to-work-with-lwrp-or-urp.736583/

Shader "AR Shadows LightWeight RP"
{
	Properties
	{
	}

	SubShader
	{
		Tags
		{
			"RenderType" = "Transparent"
			"RenderPipeline" = "UniversalPipeline"
			"IgnoreProjector" = "True"
		}
		LOD 300

		Pass
		{
			Name "AR Proxy"
			Tags
			{
				"LightMode" = "LightweightForward"
			}

			Blend SrcAlpha OneMinusSrcAlpha
			ZWrite On
			Cull Off

			HLSLPROGRAM
			#pragma prefer_hlslcc gles
			#pragma exclude_renderers d3d11_9x
			#pragma target 2.0

		// -------------------------------------
		// Material Keywords
		#pragma shader_feature _ALPHATEST_ON
		#pragma shader_feature _ALPHAPREMULTIPLY_ON

		// -------------------------------------
		// Lightweight Pipeline keywords
		#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
		#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
		#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
		#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
		#pragma multi_compile _ _SHADOWS_SOFT

		// -------------------------------------
		// Unity defined keywords
		#pragma multi_compile _ DIRLIGHTMAP_COMBINED
		#pragma multi_compile _ LIGHTMAP_ON

		//--------------------------------------
		// GPU Instancing
		#pragma multi_compile_instancing

		#pragma vertex HiddenVertex
		#pragma fragment HiddenFragment

		#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Core.hlsl"
		#include "Packages/com.unity.render-pipelines.lightweight/ShaderLibrary/Lighting.hlsl"

		struct Attributes
		{
			UNITY_VERTEX_INPUT_INSTANCE_ID
			float4 positionOS   : POSITION;
		};

		struct Varyings
		{
			float4 positionCS   : SV_POSITION;
			float4 shadowCoord  : TEXCOORD0;
		};

		Varyings HiddenVertex(Attributes input)
		{
			Varyings output = (Varyings)0;

			UNITY_SETUP_INSTANCE_ID(input);
			UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);

			VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);

			output.shadowCoord = GetShadowCoord(vertexInput);
			output.positionCS = vertexInput.positionCS;

			return output;
		}

		half4 HiddenFragment(Varyings input) : SV_Target
		{
			UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);

			half s = MainLightRealtimeShadow(input.shadowCoord);

			return half4(0, 0, 0, 1 - s);
		}
		ENDHLSL
	}

	UsePass "Universal Render Pipeline/Lit/DepthOnly"
	}

		FallBack "Hidden/InternalErrorShader"
}

Real-time Shadow (For Build-in RP)

// (c) 2020 Tongzhou Yu
// Ref. https://forum.unity.com/threads/transparent-shader-receive-shadows.325877/

Shader "AR Shadows BuildIn RP"
{
	Properties
	{
		_Color("Main Color", Color) = (1,1,1,.5)
		_ShadowIntensity("Shadow Intensity", Range(0, 1)) = 0.6
	}


		SubShader
	{

		Tags {"Queue" = "Geometry" }

		Pass
		{
			Tags {"LightMode" = "ForwardBase" }
			Cull Back
			Blend SrcAlpha OneMinusSrcAlpha
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fwdbase

			#include "UnityCG.cginc"
			#include "AutoLight.cginc"
			uniform fixed4  _Color;
			uniform float _ShadowIntensity;

			struct v2f
			{
				float4 pos : SV_POSITION;
				LIGHTING_COORDS(0,1)
			};
			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				TRANSFER_VERTEX_TO_FRAGMENT(o);

				return o;
			}
			fixed4 frag(v2f i) : COLOR
			{
				float attenuation = LIGHT_ATTENUATION(i);
				return fixed4(0,0,0,(1 - attenuation)*_ShadowIntensity) * _Color;
			}
			ENDCG
		}

	}
		Fallback "VertexLit"
}

⑤ Post-processing(屏幕特效,BRP)

点击此处下载示例工程文件,本工程同时包含增强现实窗户功能,详情参考此教程

Post-processing中能够特别快速提高增强现实应用的画面真实性与沉浸感的是两项效果器,一是Ambient Occlusion,另一个则是Chromatic Aberration,在这里就不细述这些效果器该如何设置数值等(因人而已),只简述下Post-processing的配置办法:

  1. Package Manager中Install “Post Processing”(版本号2.2.2);
  2. AR Camera>Add Component “Post-process Layer”;
  3. 将AR Camera>Layer选择为“Post Processing”(列表中没有的话,Add Layer一个Post Processing即可);
  4. 将AR Camera>Post-process Layer>Layer选择为Post Processing;
  5. Create一个Empty Gameobject,取名为PostProController;
  6. PostProController>Add Component “Post-porcess Volume”;
  7. 将PostProController>Layer选择为“Post Processing”;
  8. 勾选PostProController>IsGlobal(对AR来说很重要);
  9. 单击PostProController>Post-process Volume>Profile>New,就会自动生成一个PostProcessProfile;
  10. 用Add effect按钮自由设置自己想要的屏幕效果即可,效果详细介绍可以查看Unity的Post-processing官方文档,或看图片下方的列表说明。
  1. Ambient Occlusion 环境光遮罩:用来使像是世界中难以照射到光线的角落,交叉点等地方变暗。
  2. Anti aliasing 抗锯齿:抗锯齿功能提供的算法可以是锯齿感明显的边缘更加平滑,虽然锯齿感减少,却会使物体变得模糊。
  3. Auto Exposure 自动曝光:模拟人眼适应各种黑暗与光亮的效果,比如从黑暗的隧道出来时,人眼会有短暂时间的炫目。
  4. Bloom 辉光:最常用的Post-process特效之一,效果和他的名字一样,提供图像从明亮边缘扩散的效果,Dirtiness可以模拟污渍和灰尘来衍生Bloom特效,在FPS游戏中常见这类效果。
  5. Chromatic Aberration 色差:在边界产生一些颜色条纹,模拟相机镜头为颜色没有汇聚的缺陷行为来增加艺术性的效果,可以用来模拟中毒特效。
  6. Color Grading 颜色分级:另一个经常用到的特效,用于校正镜头中的颜色与亮度,来实现电影或海报效果,可以理解为手机中的何种滤镜。需要一定的专业基础才能玩转,但是通过调整Tonemapping(色调映射)的mod可以快速实现一些效果。
  7. Deferred Fog 延时雾效:雾是根据与相机的距离将颜色叠加到对象上的效果。 这用于模拟室外环境中的雾或雾,并且通常还用于在摄像机的远剪裁平面向前移动以提高性能时隐藏对象的剪裁。
  8. Depth of Field 景深:常用特效之一,模拟相机镜头的对焦效果而产生模糊感。模糊不仅给出了关于物体距离的视觉提示,而且还引入了散景,这是令人愉悦的视觉伪像。
  9. Grain 颗粒效果:模拟老电影屏幕上的颗粒感,用于模拟老式显像设备。
  10. Lens Distortion 镜头失真:此效果通过扭曲或不失真最终渲染图片来模拟镜头的形状。
  11. Motion Blur 运动模糊:“运动模糊”是一种常见的后处理效果,可以模拟当相机拍摄的对象移动得比相机的曝光时间快时图像的模糊。运动模糊用于在大多数类型的游戏中产生微妙的效果,但在一些类型中被夸大,例如赛车游戏。
  12. Screen space Reflections 屏幕空间反射:屏幕空间反射是一种重用屏幕空间数据来计算反射的技术。 它通常用于产生更微妙的反射,例如在潮湿的地板表面或水坑中。
  13. Vignette 晕影:在摄影中,晕影是用于与中心相比朝向图像边缘变暗和/或去饱和的术语。经常用于艺术效果,例如将焦点绘制到图像的中心。

⑥ Post-processing(屏幕特效,URP)

Scriptable Render Pipeline 可编程渲染管线,是相对Unity内置渲染管线(BRP)而言的新技术,Unity 2018.1 之后预置了2个框架:

  1. High Definition Render Pipeline (HDRP): 高分辨率渲染管线
  2. Lightweight Render Pipeline (LWRP): 轻量级渲染管线 (现在叫做Universal Render Pipeline (URP)

URP是我在进行AR创作时的主要渲染方式,URP使用Forward渲染,获得快速、高质量的渲染。适用于移动端,部分PC及主机端,包含了Shader Graph编辑器和Post Processing后处理器。

在Package Manager中安装好URP后,新建一个Empty Gameobject后,只需一步:Add Component>Volume即可正常使用Post-porcessing功能:Add Override增加效果器。