Unity3D角色阴影制作

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

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

1、  简单贴图法

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

阴影的Inspector视图如下:

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

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

[csharp] view plaincopy

  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为:

[csharp] view plaincopy

  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角色阴影制作

时间: 2024-12-25 08:43:58

Unity3D角色阴影制作的相关文章

OpenGL简单绘制游戏角色阴影

在游戏开发中很多Q版游戏绘制角色阴影会简单的绘制一个半透明的椭圆,如下图: 这种方法的优点是实现简单,但表现效果明显不够真实.作为Q版风格尚可被玩家接受,而对于写实类游戏,多采用由美术提供针对性制作的图片作为阴影图层.这种方案效果最为理想,缺点是需要多制作大量的图片资源,使游戏包增加不少. 在最近的开发中,我想到了另一种角色阴影图形的绘制方法,这里把它分享给大家. 原理很简单,就是利用OpenGL的图像变形技术,通过把角色自身的图片进行调整,使之变成一个阴影图像. 先上效果图: 具体实现: Op

圆角边框以及阴影制作卡片式图片 - 学习笔记

圆角边框以及阴影制作卡片式图片 圆角边框 border-radius 卡片使用阴影 box-shadow 利用阴影给图片底部创造一个长方形 内部的元素会直接覆盖整个阴影 HTML 部分 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>卡片式图片&l

Unity3d 角色穿墙, 或者互插的解决方案

如果你在Unity里面使用了Rigidbody, 并且勾选了Is Kinematic 想自己通过Transfrom来控制角色的位置的话.那么你一定会碰到如果角色跑动快了,会插入到其他运动的角色或者静止的单位中,比如墙壁,建筑等等. 1:网上的解决方案: (老的解决方案) 网上到是有解决方案,不过都太复杂,都需要自己去预判下一步的步长,这个就是以前的没有引擎的老方法,原理就是如果下一步会被碰到就把下一步的位置直接设置到碰撞的边缘,而不是走满那一步.既然说到这里我们就要说一下Unity带来的全新的解

动态捕捉系统-角色动画制作新技术

制作角色动画是相当不容易的,在角色动画设计制作中,包括角色的造型.材质设置以及最后渲染等,其中运动调整和角色造型是角色动画的关键和难点,很多动画角色设计师对这个感到很棘手.因为在制作过程中很容易的会出现错误,还要修改,有时候甚至需要重新做,导致工作效率低下,还有最糟糕的是做出的动画常常不能令人满意,因此在这个时候,很多技术人员进行对新技术的探讨,发现了很多新的技术,并为人们所使用. 下面为大家介绍在角色动画中应用的新技术——动态捕捉系统(Motion Capture).动态捕捉系统的出现解决了在

unity3d 2d游戏制作的模式

  经过了4个月不懈的努力,我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了.这里MOMO先打一下广告,图灵的出版社编辑成员都非常给力,尤其是编辑小花为这本书付出了很大的努力,还有杨海玲老师,不然我也无法完成这本书的编写.等这本书出版了大家记得买喔,哇咔咔- 下面,这篇文章是MOMO 3D游戏开发书籍中的一小段章节的修改版本,本篇文章我们将探讨一下Unity3D中如何来制作2D游戏.目前市面上已经有非常成熟的2D游戏引擎,比如cocos2d 或cocos2d-x等,并且都是免费的开发者可

Unity3d 数字模型制作规范

数字模型制作规范 本文提到的所有数字模型制作,全部是用3D MAX建立模型,即使是不同的驱动引擎,对模型的要求基本是相同的.当一个VR模型制作完成时,它所包含的基本内容包括场景尺寸.单位,模型归类塌陷.命名.节点编辑,纹理.坐标.纹理尺寸.纹理格式.材质球等必须是符合制作规范的.一个归类清晰.面数节省.制作规范的模型文件对于程序控制管理是十分必要的. 首先对制作流程作简单介绍: 素材采集-模型制作-贴图制作-场景塌陷.命名.展UV坐标-灯光渲染测试-场景烘培-场景调整导出 第一章  模型制作规范

unity3d 角色头顶信息3D&amp;2D遮挡解决方案(二)

在阅读本文之前请先阅读上一篇文章:http://www.cnblogs.com/shenggege/p/4179012.html 本来一篇文章就可以说完了,但是上次只是实现了已知的一些功能 后来在实际运用中遇到了一个问题,请看图 3D场景嘛!近大远小! 当我把视角移动得很远时,头顶信息就变得很小了,小得我看不见它显示的是什么 而且如果有多个玩家的话,每个玩家都有头顶信息 当我离另外一个玩家很远时,那个玩家的头顶信息就看不见了 那么要头顶信息有何意义? 本文就解决这个问题,其实很简单的 下面是解决

Unity3D 角色(物体) 移动方法 合集

1. 简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

Unity3d 使用 BMFONT 制作的艺术字体 不能居中 解决方法

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn 转载请注明 在使用同事用 BMFONT 制作的 字体 时,在 Unity 3d 中发现,不能居中对齐. 在尝试 顶部对齐 中心对齐 底部对齐后发现,这个艺术字 是以 顶部 为锚点的. 所以结果就像上面的图片,我们选择 中心对齐,但是在 Unity3d 中看到却是 顶部 对齐了 文本框 的中心. 因为昨天正好简单学了下 Unity的 Custom Font,所以觉得可以