使用Unity进行增强现实中的光照和阴影的渲染
我们曾经为大家介绍过Unity中光照和阴影有关的内容,比如Unity实时阴影实现图解。近几年,增强现实应用开发者越来越多,相应的开发技巧被众多开发者所关注。本文将指导您对Unity和Vuforia SDK增强现实的应用进行光照和阴影渲染。这背后的理论同样适用于其它的SDK和游戏引擎。
光照与阴影的重要性
想要使用Unity创建优质的游戏场景,光照和阴影的设置是非常重要的,因为它们被用来制造场景的景深,从而让画面更加自然与真实。缺少阴影会使得画面缺乏真实感,如果没有阴影,您无法区分出人物是站在平面上还是漂浮在空中,如下图所示。
从上图中可以看出有无阴影的明显区别,在AR增强现实应用开发中也是如此。
渲染光照和阴影存在的问题
如果想在Unity中渲染光照或者阴影,就必须有网格。但是,添加网格会遮挡相机视图。如下图所示,灰色的平板挡住了桌面。
如果把灰色平板换成透明材质不就可以解决这个问题么?其实不然,如果使用透明材质替代上图的灰色平面,使用Unity的标准着色器就无法在上面投射阴影(虽然可能有些自定义着色器可以投射)。如下图所示,使用透明材质可以看到桌面,但没有阴影。
解决思路:分别渲染光照和阴影
最初的想法是利用叠加(Addition)或者复合(Multiplication)效果,可以分别渲染光照和阴影,然后使用后处理效果将阴影和相机视图结合起来。
我们可以将场景内容分为三层:背景、光照和阴影、3D对象,然后将它们合并到一起。
背景层:只包含相机渲染的图像
光照和阴影层
3D对象层
三层叠加的最终效果
上图由于桌面太黑了,因此可能看不清阴影。您可以查看下面的视频了解更多详情。
https://v.qq.com/txp/iframe/player.html?vid=x0377xmquir&width=500&height=375&auto=0
详细步骤
如果您还不清楚Unity结合Vuforia开发AR应用的基本步骤,可以先看看之前的文章《5分钟使用Unity制作AR应用》。
总得来讲,我们需要添加三个相机分别用来渲染背景、光照和阴影以及增强现实对象,这三个相机的视角与Vuforia的Augmented Reality Camera相机完全一样,本例中使用CopyCameraData.cs来实现上述功能。另外,由于无法将对象的阴影渲染到另外一层,因此需要将其进行拷贝,我们需要编辑副本的“Mesh Renderer”,将“Cast Shadows”属性设置为“Shadow Only”。最后,本例中使用了Color FX插件实现后处理效果。您可以在文末查看教程的视频演示,并点击【阅读原文】下载教程相关素材。
使用Unity实现本例中AR环境下的阴影与光照渲染效果的详细步骤如下:
1)新建场景,删除新场景默认的主相机和平行光。
2)将Vuforia中的预制件ARCamera拖拽至场景中,在检视面板中加入App License Key(Vuforia 的激活码), 并勾选配置文件的Datasets(数据集)中的Load MyTargets Database和Active。
3)将Vuforia 中的预制件ImageTarget拖拽至场景中,设置好Database中的目标识别图。
4)新建一个Plane,将其Position的Y值设为-0.01(略低于识别目标图)。
5)新建一个立方体和球体,作为光照遮挡物。
6)新建一个点光源,设置好光照范围和阴影类型。
7)将ARCamera的中的World Center Mode由FIRST_TARGET改为SPECIFIC_TARGET。并将目标图像(ImageTarget)指定给World Center。
8)在ARCamera下再创建两个Camera分别命名为Light Camera和ARObject Camera。
9)打开Tags & Layers检视面板,分别添加Background Layer、Light Layer 和 ARObject Layer三个层。
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。
13)删除_ARObjects中的 Plane,并将其层级设置为ARObject Layer。
这样三个相机对应三层就设置好了。最后在Camera上添加后处理脚本对图像进行混合。本例中使用Colorful FX插件进行混合以实现后处理效果,您也可以使用其它的后处理脚本。在Light Camera上添加RendderTextureToBlend脚本并将Camera赋给脚本的Blend属性。最后将ARObject Camera的Clear Flags设置为Depth only并调整深度值即可。调整混合模式选取最理想的效果。
您可以跟着下面的视频一起练习一下:
https://v.qq.com/txp/iframe/player.html?vid=a0377v1acod&width=500&height=375&auto=0
在教学视频中所涉及一些自定义的脚本,您可以点击【阅读原文】进行下载。
总结
希望本文可以帮您实现增强现实项目中的光照和阴影渲染。如果您有任何疑问,欢迎点击【阅读原文】访问Unity官方中文社区(forum.china.unity3d.com)进行提问。
更多Unity技术文章
详解Unity 5 全局光照系统Enlighten问题(上)
详解Unity 5 全局光照系统Enlighten问题(下)
近期活动
活动一:2017 Unity技术路演 — 华南站将于3月6日开启,仅剩12天!报名从速。详情请关注2017 Unity技术路演正式启动,3月华南区报名开启!
活动二:Unite 2017 Shanghai将于5月11 - 13日在上海国际会议中心举行!比5折还便宜的超值早鸟票现已开售!详情请关注“再一次问候” - Unite 2017 Shanghai 正式开启。
点击“阅读原文”访问Unity官方中文论坛!