我们曾经为大家介绍过Unity中光照和阴影有关的内容,比如Unity实时阴影实现图解。近几年,增强现实应用开发者越来越多,相应的开发技巧被众多开发者所关注。本文将指导您对Unity和Vuforia SDK增强现实的应用进行光照和阴影渲染。这背后的理论同样适用于的SDK和游戏引擎。

光照与阴影的重要性
想要使用Unity创建优质的游戏场景,光照和阴影的设置是非常重要的,因为它们被用来制造场景的景深,从而让画面更加自然与真实。缺少阴影会使得画面缺乏真实感,如果没有阴影,您无法区分出人物是站在平面上还是漂浮在空中,如下图所示。

102716ameq5mejsssgmt59.jpg
从上图中可以看出有无阴影的明显区别,在AR增强现实应用开发中也是如此。

渲染光照和阴影存在的问题
如果想在Unity中渲染光照或者阴影,就必须有网格。但是,添加网格会遮挡相机视图。如下图所示,灰色的平板挡住了桌面。

102717ow7g99tu6ix9wgx1.jpg
如果把灰色平板换成透明材质不就可以解决这个问题么?其实不然,如果使用透明材质替代上图的灰色平面,使用Unity的标准着色器就无法在上面投射阴影(虽然可能有些自定义着色器可以投射)。如下图所示,使用透明材质可以看到桌面,但没有阴影。

102718xb6pfs0x0q0etlyf.jpg
解决思路:分别渲染光照和阴影
最初的想法是利用叠加(Addition)或者复合(Multiplication)效果,可以分别渲染光照和阴影,然后使用后处理效果将阴影和相机视图结合起来。

我们可以将场景内容分为三层:背景、光照和阴影、3D对象,然后将它们合并到一起。

102718j6ryybkrnnl6qra6.jpg
背景层:只包含相机渲染的图像

102718k6hyttzzc06eyhc6.jpg
光照和阴影层

102718eomc33krco5ckvrr.jpg
3D对象层

102719qrm4mrsef1mmnaa8.jpg
三层叠加的最终效果
上图由于桌面太黑了,因此可能看不清阴影。您可以查看下面的视频了解更多详情。



详细步骤
如果您还不清楚Unity结合Vuforia开发AR应用的基本步骤,可以先看看之前的文章《5分钟使用Unity制作AR应用》。


102720y7gsyhlo90t3900z.jpg
3)将Vuforia 中的预制件ImageTarget拖拽至场景中,设置好Database中的目标识别图。
4)新建一个Plane,将其Position的Y值设为-0.01(略低于识别目标图)。
5)新建一个立方体和球体,作为光照遮挡物。
6)新建一个点光源,设置好光照范围和阴影类型。

102719tbos7revgb7w2kw7.jpg
7)将ARCamera的中的World Center Mode由FIRST_TARGET改为SPECIFIC_TARGET。并将目标图像(ImageTarget)指定给World Center。

102719slpolejrolnrrrjj.jpg
8)在ARCamera下再创建两个Camera分别命名为Light Camera和ARObject Camera。
9)打开Tags Layers检视面板,分别添加Background Layer、Light Layer 和 ARObject Layer三个层。

102719oegz4jtnsdd8j8lq.jpg
10)设置ARCamera下方的三个相机。将Light Camera的Culling Mask设置为Light Layer和Default;ARObject Camera的Culling Mask设置为ARObject Layer和Default;Camera 的Clear Flags设置为Solid Color, Culling Mask设置为Background Layer, 并且其子节点BackgroundPlane的Layer设置为Background Layer。

11)分别为Light Camera和ARObject Camera 添加 CopyCameraData脚本并将TargetCamera指定为Camera。

12)调整一下相机的视角,创建一个空对象命名为_ARObjects并将Plane、Cube和Sphere拖拽至其下方。然后复制_ARObjects对象并命名为_Light Layer Objects,并将Cube和Sphere的Cast Shadows 设置为Shadows Only。将_Light Layer Objects的层级设置为Light Layer。

102719ss7wgqb6upxq3vq0.jpg
13)删除_ARObjects中的 Plane,并将其层级设置为ARObject Layer。

102720g65s6bezue56b4bf.jpg
这样三个相机对应三层就设置好了。最后在Camera上添加后处理脚本对图像进行混合。本例中使用Colorful FX插件进行混合以实现后处理效果,您也可以使用的后处理脚本。在Light Camera上添加RendderTextureToBlend脚本并将Camera赋给脚本的Blend属性。最后将ARObject Camera的Clear Flags设置为Depth only并调整深度值即可。调整混合模式选取最理想的效果。

您可以跟着下面的视频一起练习一下。


在教学视频中所涉及一些自定义的脚本,您可以回复本贴获取下载链接。

总结
希望本文可以帮您实现增强现实项目中的光照和阴影渲染。如果您有任何疑问,欢迎在文末回复提问。想要更及时地获取相关信息,请继续关注Unity官方平台。


104042fz8k7vkww2kkbm2f.png
davinci8,如果您要查看本帖隐藏内容请回复



原文链接:Rendering Light and Shadow with Unity for Augmented Reality
感谢Unity官方翻译组成员“fubb”对本文翻译所做的贡献。
转载请注明来源:Unity官方中文社区 (forum.china.unity3d.com)。请勿私自更改任何版权说明信息。


近期活动

活动一:2017 Unity技术路演 — 华南站将于3月6日开启,仅剩12天!报名从速。详情请关注2017 Unity技术路演正式启动,3月华南区报名开启!

活动二:Unite 2017 Shanghai将于5月11 - 13日在上海国际会议中心举行!比5折还便宜的超值早鸟票现已开售!详情请关注“再一次问候” - Unite 2017 Shanghai 正式开启。


104921wdla73xa3b7xtdol.png
增强现实, 光照, 阴影锐亚教育

锐亚教育 锐亚科技 unity unity教程