AR中虚拟物体投射阴影的Unity Shader实现

在开发AR应用中如果虚拟物体能"投射阴影到现实环境中",沉浸感会大大增加.而且大多数AR应用都会这么做。

在网上查找相关的实现,社区文章不少,但是几乎都是转载的AR 中的阴影与浮现效果 (Unity实现)这篇文章https://blog.csdn.net/u012842807/article/details/46730203。这种解决方案虽然可以实现AR阴影,但是在开启HDR后,其承接阴影的平面就清晰可见,露出破绽(请大神解释一下原因)。

于是受其启发,使用Unlit Shader实现了另一种方案,分享一下:

先演示一下效果:

虚拟的小人向桌面投出了影子,以假乱真

经常写Shader的同学应该知道其实编写一个能接受影子的Shader并不是一件难事,只需要添加以下影子三剑客——SHADOW_COORDSTRANSFER_SHADOWSHADOW_ATTENUATION三个宏。关键就是最后一个宏SHADOW_ATTENUATION,这个宏返回一个fixed的值,表示了光照衰减。该值在越没有影子的时候,越接近1,在影子越浓烈的地方越接近0。因此,这个光照衰减就是我们解决问题的关键,可以让我们写出一个只渲染阴影的Shader。

直接上代码:

Shader "ChuckLee/ARShadow"
{
	Properties
	{
		_ShadowColor ("Shadow Color", Color) = (0.1, 0.1, 0.1, 0.53)
	}
	SubShader
	{
		Tags { "RenderType"="Transparent" "Queue"="Geometry+1"}
		Blend SrcAlpha OneMinusSrcAlpha 

		Pass
		{
			Tags { "LightMode"="ForwardBase" }

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fwdbase
			
			#include "UnityCG.cginc"
			#include "AutoLight.cginc" 

			struct appdata
			{
				float4 vertex : POSITION;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				SHADOW_COORDS(2)
			};

			fixed4 _ShadowColor;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				TRANSFER_SHADOW(o);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed atten = SHADOW_ATTENUATION(i);
				return fixed4(_ShadowColor.rgb,saturate(1-atten)*_ShadowColor.a);
			}
			ENDCG
		}
	}
	FallBack "Diffuse"
}

关键在于片元着色器的这段

fixed atten = SHADOW_ATTENUATION(i);
return fixed4(_ShadowColor.rgb,saturate(1-shadow)*_ShadowColor.a);

我们取1和atten的差,归到(0,1)区间,然后乘以_ShadowColor的alpha值,最终作为输出片元的alpha值。saturate(1-shadow)*_ShadowColor.a在非阴影区域内为0,开启透明混合以后,此处是透明的,所以非阴影部分不会得到提现,而阴影区域得到大于零的值,并根据_ShadowColor 的值被渲染出想要的颜色和柔和度。

用这个Shader建立一个Materia放在Qaud上,把Qaud放在"地面"上就可以了,它其他物体投来的接受阴影,并且只渲染这个阴影。

(宏要联系上下文,比如宏TRANSFER_SHADOW的定义中有"ComputeScreenPos(o.pos)"(把顶点从裁剪空间向屏幕空间变换),所以在结构v2f你只能给顶点坐标变量起名pos,写成float4 blabla : SV_POSITION是不行。)

原文:https://zhuanlan.zhihu.com/p/30238772

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程介绍 本套课程从技术理念到项目实践,教大家系统掌握ARKit技术开发,随心打造iOS端AR增强现实应用。由一开始的开发环境搭建,到Unity ARKit Plugin、ARFoundation ARKit等不同时期技术的讲解。从平面模型放置、识别图片、手势交互、3D物体识别、面部AR贴纸、光照估计、环境探针、多人AR技术,甚至包含ARKit3.0的动作捕捉技术等。除了以上课程内容,更加入了随着技术更新与时俱进更新的ARKit连载技术教学内容。课程收益 轻松理解ARKit的技术原理,从零到一创建自己的第一个AR项目。学习UnityARKit Plugin经典技术,了解ARKit的常见概念和原理。学会在 ARFoundation 使用ARKit,进行企业级AR项目开发。学会如何在AR项目里播放模型动画,通过触屏手势交互实现模型的旋转和缩放。 了解ARKit的图片识别,掌握AR卡片、AR书籍的实现方法。 学会使用面部增强技术,实现热门短视频应用的AR贴纸效果,实现面部表情追踪。学会使用ARKit物体检测技术,实现3D物体识别,可以广泛应用于工业、建筑、古董、玩具手办、艺展览等不同场景。学习ARKit的经典交互案例,优化AR项目的用户体验。熟练使用环境纹理、光照估计技术,让AR内容随当前现实场景自动变化调节,看起来更加真实。基于WorldMap、CollaborativeSession AR技术,实现AR场景的持久化及多人AR体验效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值