Unity3D游戏制作(三)——移动平台上的角色阴影制作
本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处。
http://blog.csdn.net/amazonzx/article/details/7973740
本文将重点介绍两种目前在移动平台上的主流阴影制作技术,同时也会简单介绍两种移动平台上相对较为高级的动态阴影生成方法。
由于目前主流使用Unity3.x在移动平台上并不支持阴影的动态生成技术,所以目前最普遍流行同时性价比也最高的阴影生成方法有以下两种:
1、 简单贴图法
所谓简单贴图法即是直接在角色的角底附加一个阴影半透明贴图,并让其跟随角色一起运动,一般是将该阴影Object成为角色模型的子物体,该种阴影生成效果如下:

阴影的Inspector视图如下:

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

对于材质,最重要的则是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 }
- }
- }
- }
通过以上设置即可生成最简单的阴影效果,大家可以通过自己设定脚本来控制阴影的移动和变化等等。
但是,该阴影生成方法有一个明显的“硬伤”,即该阴影只能适用于平坦的地面,一旦地面凹凸不平或有遮挡物,则会出现“穿帮”的效果,如下图所示,该方法生成的阴影对脚下的正方体完全没有影响,所以为了解决这种问题,投影生成法应运而生。

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

下面我就具体介绍一下该阴影的生成方法:
(1) 通过“GameObject->Create Empty”来创建一个空的物体,并取名为“Shadow Projector”。
(2) 通过“Component->Effects->Projector”在该空物体上加入Projector组件,并通过平移、旋转和调整参数达到如下效果:

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

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

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

其中材质所用到的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,效果图如下所示:

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

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

其生成方法大致为如下三步:
首先在角色脚底生成一个显示阴影的网格。

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

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

小结
综上所述,本文已经给出了移动平台上角色阴影的两种基本渲染方法及其Shader实现,在这里我并没有去分析每种渲染效果的原理,而仅是从实际出发,直接给出对应的简单实现方法。如果想要对阴影的生成方法进行深入理解,可以Google搜索其原理进行了解。对于后两种真实的动态阴影生成方法,我将在后续的blog中进行详细更新。
Unity3D游戏制作(三)——移动平台上的角色阴影制作的更多相关文章
- C#三个平台上的文件选择方法
wpf: Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); dlg.DefaultExt = &qu ...
- 将Unity3D游戏移植到Android平台上
将Unity3D游戏移植到Android平台是一件很容易的事情,只需要在File->Build Settings中选择Android平台,然后点击Switch Platform并Build出ap ...
- Unity3D游戏在iOS上因为trampolines闪退的原因与解决办法
http://7dot9.com/?p=444 http://whydoidoit.com/2012/08/20/unity-serializer-mono-and-trampolines/ 确定具体 ...
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪
朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...
- unity3D开发的程序发布到Android平台上进行运行测试的详细步骤
第一步 下载安装JDK 和SDK 1.需要配置java环境.点击链接进入ava的配置的方法:http://www.cnblogs.com/Study088/p/7496158.html 2.下载 ...
- Unity3D 游戏在 iOS 上因为 trampolines 闪退的原因与解决办法
崩溃的情况 进入游戏一会儿,神马都不要做,双手离开手机,盯着屏幕看吧,游戏会定时从服务器那儿读取一些数据,时间一长,闪退了.尼玛问题是神马呢?完全没有头绪,不过大体猜测是因为网络请求导致的,那么好,先 ...
- unity3d游戏无法部署到windows phone8手机上的解决方法
今天搞了个unity3d游戏,准备部署到自己的lumia 920上,数据线连接正常,操作正常,但是“build”以后,始终无法部署到手机上,也没有在选择的目录下生产任何相关文件.(你的系统必须是win ...
- 实验三 CC2530平台上CC2530平台上定时器组件的
实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS ...
随机推荐
- node 相关网站
包管理网站:https://www.npmjs.com/
- Stanford CS231n - Convolutional Neural Networks for Visual Recognition
网易云课堂上有汉化的视频:http://study.163.com/course/courseLearn.htm?courseId=1003223001#/learn/video?lessonId=1 ...
- 【ES】学习5-全文搜索
全文搜索两个最重要的方面是:相关性, 分析. 一旦谈论相关性或分析这两个方面的问题时,我们所处的语境是关于查询的而不是过滤. match:单个词查询 GET /my_index/my_type/_se ...
- PHP 闭包
一.闭包基本用法闭包(Closure)又叫做匿名函数,也就是没有定义名字的函数.比如下面的例子: // 定义一个闭包,并把它赋给变量 $f $f = function () { return 7; } ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- web中切图、快速切图与web雪碧图制作的方法
声明: web小白的笔记,欢迎大神指点,联系QQ:1522025433. 工具:Photoshop 1.复制文字:点击文章工具后选择文字. 2.矩形选框工具 看信息 f8, 取消矩形选框 Ctrl+D ...
- [转] HTML5利用WebRTC的getUserMedia获取摄像头信息模拟拍照及视频(完整示例)
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- Dockerfile中ENTRYPOINT 和 CMD的区别
一.dockerfile中的 CMD 1.每个dockerfile中只能有一个CMD如果有多个那么只执行最后一个. 2.CMD 相当于启动docker时候后面添加的参数看,举个简单例子: docker ...
- 057 Hive项目案例过程
1.说明 这里只粘贴一张,图,主要针对的hive的项目的实践过程. 2.图 3.需求 统计PV 统计注册人数 => 这个是一个公司会关注的,每天的注册率. 统计ip 统计跳出率 => ip ...
- MATLAB·提取图像中多个目标
基于matlab工具箱提取图像中的多目标特征(代码如下): 代码前面部分为提取图像的边界信息,调用了后面的遍历函数Pixel_Search,函数实现方法见后~ %%ROI Testing close ...