本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处。

http://blog.csdn.net/amazonzx/article/details/7973740

本文将重点介绍两种目前在移动平台上的主流阴影制作技术,同时也会简单介绍两种移动平台上相对较为高级的动态阴影生成方法。

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

1、  简单贴图法

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

阴影的Inspector视图如下:

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

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

  1. Shader "iPhone/SimpleShadow"
  2. {
  3. Properties
  4. {
  5. _MainTex ("MainTex", 2D) = "" {}
  6. }
  7. SubShader
  8. {
  9. Tags { "Queue" = "Transparent" }
  10. Pass
  11. {
  12. Blend SrcAlpha OneMinusSrcAlpha
  13. Color [_clrBase]
  14. Cull Off
  15. Lighting Off
  16. SetTexture [_MainTex] { combine texture, one - texture }
  17. }
  18. }
  19. }

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

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

2、  投影生成法

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

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

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

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

 

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

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

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

其中材质所用到的shader为:

  1. Shader "Projector/Multiply" {
  2. Properties {
  3. _ShadowTex ("Cookie", 2D) = "gray" { TexGen ObjectLinear }
  4. _FalloffTex ("FallOff", 2D) = "white" { TexGen ObjectLinear   }
  5. }
  6. Subshader {
  7. Tags { "RenderType"="Transparent-1" }
  8. Pass {
  9. ZWrite Off
  10. Fog { Color (1, 1, 1) }
  11. AlphaTest Greater 0
  12. ColorMask RGB
  13. Blend DstColor Zero
  14. Offset -1, -1
  15. SetTexture [_ShadowTex] {
  16. combine texture, ONE - texture
  17. Matrix [_Projector]
  18. }
  19. SetTexture [_FalloffTex] {
  20. constantColor (1,1,1,0)
  21. combine previous lerp (texture) constant
  22. Matrix [_ProjectorClip]
  23. }
  24. }
  25. }
  26. }

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

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

3、 Shadow Map方法

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

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

4、  环境遮挡方法

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

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

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

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

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

小结

综上所述,本文已经给出了移动平台上角色阴影的两种基本渲染方法及其Shader实现,在这里我并没有去分析每种渲染效果的原理,而仅是从实际出发,直接给出对应的简单实现方法。如果想要对阴影的生成方法进行深入理解,可以Google搜索其原理进行了解。对于后两种真实的动态阴影生成方法,我将在后续的blog中进行详细更新。

Unity3D游戏制作(三)——移动平台上的角色阴影制作的更多相关文章

  1. C#三个平台上的文件选择方法

    wpf: Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); dlg.DefaultExt = &qu ...

  2. 将Unity3D游戏移植到Android平台上

    将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ...

  3. Unity3D游戏在iOS上因为trampolines闪退的原因与解决办法

    http://7dot9.com/?p=444 http://whydoidoit.com/2012/08/20/unity-serializer-mono-and-trampolines/ 确定具体 ...

  4. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  5. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  6. unity3D开发的程序发布到Android平台上进行运行测试的详细步骤

    第一步    下载安装JDK 和SDK 1.需要配置java环境.点击链接进入ava的配置的方法:http://www.cnblogs.com/Study088/p/7496158.html 2.下载 ...

  7. Unity3D 游戏在 iOS 上因为 trampolines 闪退的原因与解决办法

    崩溃的情况 进入游戏一会儿,神马都不要做,双手离开手机,盯着屏幕看吧,游戏会定时从服务器那儿读取一些数据,时间一长,闪退了.尼玛问题是神马呢?完全没有头绪,不过大体猜测是因为网络请求导致的,那么好,先 ...

  8. unity3d游戏无法部署到windows phone8手机上的解决方法

    今天搞了个unity3d游戏,准备部署到自己的lumia 920上,数据线连接正常,操作正常,但是“build”以后,始终无法部署到手机上,也没有在选择的目录下生产任何相关文件.(你的系统必须是win ...

  9. 实验三 CC2530平台上CC2530平台上定时器组件的

    实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS ...

随机推荐

  1. CentOS切换为iptables防火墙并进行相关配置

    CentOS切换为iptables防火墙 切换到iptables首先应该关掉默认的firewalld,然后安装iptables服务. 1.关闭firewall: service firewalld s ...

  2. php单例模式的实例

    class Config1 {} class Config { * 必须先声明一个静态私有属性:用来保存当前类的实例 * 1. 为什么必须是静态的?因为静态成员属于类,并被类所有实例所共享 * 2. ...

  3. 目标检测-ssd

    intro: ECCV 2016 Oral arxiv: http://arxiv.org/abs/1512.02325 paper: http://www.cs.unc.edu/~wliu/pape ...

  4. web----框架基础

    Web框架本质: 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 真实开发中的python web程序来说,一般会分为两部分:服务器 ...

  5. openj 4004 01背包问题求方案数

    #include<iostream> #include<cstring> #include<cstdio> using namespace std; #define ...

  6. uva12436 回头再做一次

    线段树维护等差数列,结点维护首项+公差即可 #include <cstdio> #include <cstring> #include <algorithm> us ...

  7. (一)什么是webservice?

    第一节: 第一节:Webservice 简介 第二节: 第二节:CXF 简介 webservice 有的人一看到这个,估计会认为这个是一种新技术,一种新框架. 其实不是,严格的说,webservice ...

  8. Redis 5.0 集群搭建

    Redis 5.0 集群搭建 单机版的 Redis 搭建 https://www.jianshu.com/p/b68e68bbd725 /usr/local/目录 mkdir redis-cluste ...

  9. day8--socket文件传输

    FTP server 1.读取文件名 2.检测文件是否存在 3.打开文件 4.检测文件大小(告诉客户端发送文件的大小) 5.发送文件大小和MD5值给客户端,MD5 6.等待客户端确认(防止粘包) 7. ...

  10. asp.net core session的使用

    Session介绍 本文假设读者已经了解Session的概念和作用,并且在传统的.net framework平台上使用过. Asp.net core 1.0好像需要单独安装,在nuget控制台,选择你 ...