Unity3D如何实现移动平台上的角色阴影

小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

由于目前主流使用Unity3.x在移动平台上并不支持阴影的动态生成技术,所以目前最普遍流行同时性价比也最高的阴影生成方法有以下两种:

1、  简单贴图法

所谓简单贴图法即是直接在角色的角底附加一个阴影半透明贴图,并让其跟随角色一起运动,一般是将该阴影Object成为角色模型的子物体,该种阴影生成效果如下:

Unity3D如何实现移动平台上的角色阴影

阴影的Inspector视图如下:

Unity3D如何实现移动平台上的角色阴影

其中ShadowComponent是控制阴影的一个脚本,与其生成无关,故不再这里介绍。影响该应用生成的主要有两个部分,一个是Shadow网格,另外一个则是渲染所需要的材质“No Name”。需要注意的是,Shadow网格是一个平面,但不建议使用Unity自身生成的Plane,因为Unity生成的面数较多,可通过3DMax等建模工具来自行建模,如下所示:

Unity3D如何实现移动平台上的角色阴影

对于材质,最重要的则是Shader的书写,我将其列在下方,以方便大家使用:

Shader "iPhone/SimpleShadow"  
{  
    Properties  
    {  
        _MainTex ("MainTex", 2D) = "" {}  
    }  
  
    SubShader  
    {  
        Tags { "Queue" = "Transparent" }  
  
        Pass  
        {  
            Blend SrcAlpha OneMinusSrcAlpha  
              
            Color [_clrBase]  
              
            Cull Off  
            Lighting Off  
            SetTexture [_MainTex] { combine texture, one - texture }  
        }  
    }  
}

通过以上设置即可生成最简单的阴影效果,大家可以通过自己设定脚本来控制阴影的移动和变化等等。

但是,该阴影生成方法有一个明显的“硬伤”,即该阴影只能适用于平坦的地面,一旦地面凹凸不平或有遮挡物,则会出现“穿帮”的效果,如下图所示,该方法生成的阴影对脚下的正方体完全没有影响,所以为了解决这种问题,投影生成法应运而生。

Unity3D如何实现移动平台上的角色阴影

2、  投影生成法

该方法本质上来说是一种贴花(Decal)技术,即设定一个投影器,然后将阴影贴图投射到你想展现阴影的地方,该方法的优点在于投影效果不取决于被投影区域的几何形状,即被投影区域可以任意凹凸的曲面,也可以处理各种障碍物。该方法生成的阴影效果如下:

Unity3D如何实现移动平台上的角色阴影

下面我就具体介绍一下该阴影的生成方法:

(1) 通过“GameObject->Create Empty”来创建一个空的物体,并取名为“Shadow Projector”。

(2)通过“Component->Effects->Projector”在该空物体上加入Projector组件,并通过平移、旋转和调整参数达到如下效果:

Unity3D如何实现移动平台上的角色阴影

Unity3D如何实现移动平台上的角色阴影

(3) 然后在Material选项中拖入已经准备好的材质,即可投影出阴影,效果如下:

Unity3D如何实现移动平台上的角色阴影

我们看到,场景中不仅生成了阴影,同时角色的身体也“变黑”了,这是因为投影器的“Ignore Layers”设定为“Nothing”的缘故,我们将可忽略层设为角色的层“Player”,则可使角色不再被投影,效果如下:

Unity3D如何实现移动平台上的角色阴影

(4)最终的Shadow Projector的Inspector视图如下:

Unity3D如何实现移动平台上的角色阴影

其中材质所用到的shader为:

Shader "Projector/Multiply" {  
   Properties {  
      _ShadowTex ("Cookie", 2D) = "gray" { TexGen ObjectLinear }  
      _FalloffTex ("FallOff", 2D) = "white" { TexGen ObjectLinear   }  
   }  
  
   Subshader {  
      Tags { "RenderType"="Transparent-1" }  
      Pass {  
         ZWrite Off  
         Fog { Color (1, 1, 1) }  
         AlphaTest Greater 0  
         ColorMask RGB  
         Blend DstColor Zero  
         Offset -1, -1  
         SetTexture [_ShadowTex] {  
            combine texture, ONE - texture  
            Matrix [_Projector]  
         }  
         SetTexture [_FalloffTex] {  
            constantColor (1,1,1,0)  
            combine previous lerp (texture) constant  
            Matrix [_ProjectorClip]  
         }  
      }  
   }  
}

通过以上的步骤,我们即可实现投影式的阴影生成方法。与第一种方法一样,可以设定一些特定脚本来控制该阴影的移动以及变化等等。另外,需要注意的一点是“Ignore Layers”选项的设定,原则上是尽量去掉那些不需要被投影的层,从而来减少不必要的计算量。

上述两种方法是目前移动平台上的主流阴影生成方法,优点是生成简单,使用方便、计算量较小,但缺点同样突出,即该阴影是假的,并不是真的物体投射阴影,所以真实感并不强。下面我就介绍两种目前可以在移动平台上使用的实时动态阴影生成方法,不过在这篇中我们只介绍阴影效果,并不介绍具体的实现技术和生成方法,留待以后高级教程中讲解。

3、 Shadow Map方法

虽然Unity目前并不支持在移动设备上生成动态阴影,但同样可以通过RenderTexture来生成简单的Shadow Map,效果图如下所示:

Unity3D如何实现移动平台上的角色阴影

我们看到所生成的阴影存在锯齿,这是由于Shadow Map分辨率不够所致,你可以通过增加RenderTexture的分辨率来减少锯齿的影响,如下图所示,当然这样做的同时也会带来一定的渲染消耗。

Unity3D如何实现移动平台上的角色阴影

4、  环境遮挡方法

该方法取自于游戏《Shadow Gun》,通过分析物体的近似环境遮挡信息来实时生成动态阴影,效果如下图所示:

Unity3D如何实现移动平台上的角色阴影

其生成方法大致为如下三步:

首先在角色脚底生成一个显示阴影的网格。

Unity3D如何实现移动平台上的角色阴影

其次,根据分别在角色的跨步以及两腿处生成三个圆球,通过这三个圆球来计算底面的环境遮挡(Ambient Occlusion)信息。

Unity3D如何实现移动平台上的角色阴影

最后,根据计算所得AO信息来动态细分网格,这样就可以生成最终的AO阴影。

Unity3D如何实现移动平台上的角色阴影

看完了这篇文章,相信你对“Unity3D如何实现移动平台上的角色阴影”有了一定的了解,如果想了解更多相关知识,欢迎关注编程之家行业资讯频道,感谢各位的阅读!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先