引子:MOMO这段时间有时会玩TempRun ,后来得知它的Android版本是用Unity3D做的。后来我发现了一个诡异的问题就是TempRun角色的动态阴影到底是怎么实现的??我手头上有一个三星的Nexus7平板测试机,可是我用Unity4制作阴影放在Nexus7上动态阴影死活不显示,可是我在同样的机器Nexus7装上TempRun动态阴影就显示的非常清楚。接着我查了一下发现Unity4只是在大部分移动平台手机支持动态阴影,Nexus7 属于Tegra 3 并不支持动态阴影。TempRun是怎么实现的呢? 后来,我尝试使用RenderTexture来制作动态阴影。做是做出来了,不过要做的很精细那么有点麻烦。文章的最后我会把我的想法说出来。如下图所示,这个阴影我就是用RenderTexture来制作的。
下面开始学习,在Project视图中,选择Creat->RenderTexture ,接着在Hierarchy视图中在创建一个摄像机。(用来渲染RenderTexures)
Background :保持背景为透明,颜色值都改成 0 ,表示完全透明(截取只能按矩形所以背景需要做成透明了 不然就穿帮了)。
Culling Mshk :摄像机照射的层,这个摄像机会一直跟随主角移动,始终保持侧面观察主角。取得主角侧面每一帧的图像,并且渲染在地面上。从侧面观察难免会取到主角背景的图像,所以在这里我们把主角放在TransparentFX这个layer上,摄像机也只去这个Layer上截取模型。(当然你也可以重新创建一个Layer)
Target Texture :就是把这个摄像机每一帧所看到的图像复制给刚刚创建的RenderTexutre(刚刚创建的RenderTexure拖拽到这里即可)
然后在创建一个平面,记住一定要给它一个透明的材质球。这里我选了Transparent/Diffuse。然后是颜色,选择一个黑色偏灰色的颜色就可以。因为阴影是灰黑色的嘛。
然后在创建一条简单的脚本,把它绑在影子所在的平面上。像这样给他赋值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { public RenderTexture t; void Update () { renderer.material.mainTexture = t; } void OnGUI() { GUI.DrawTexture(new Rect(0,0,100,100),t); } } |
代码比较简单我也就不做解释了。。运行后效果,小牛头人一直在播放奔跑动画,它的影子动态的投影在身后的墙上了。
最后我在文章开始说过美中不足的地方
1.需要根据光照的旋转角度来动态计算阴影面的角度。如果光比较多那么计算量是非常庞大的,而且还有影子的根据光线的拉伸效果。
2.影子投射在地面时,如果地面凹凸不平,所以影子不能绘制在一个Plane上。而需要动态的计算影子的网格,目前我能想到的办法就是通过N条射线,从主角身后(根据主角的坐标与旋转角度来计算周围一定区域每一个点的坐标)从上方向垂直的地面发射射线,得到地面凹凸的每个点的坐标,在根据这些坐标动态的生成一个凹凸不平的网面。(如果你用的是unity3d地形那么有专门的方法得到地形的高度,如果地形使用美术建的模型来做的那么只能用这个方法喽)最后把上面做出来的RenderTexure渲在这上面。
补充。其实在StandardAssets中就有一个用投影做的简单阴影的包。在Project视图中 importPackage -> Projectors 。如下图所示,把Blob Shadows Projector 拖进Hierarchy视图中。简单的调节一下就可以了。
还有一个叫fastshadows的一个阴影插件。前几天我简单看了一下,如果是自身不会改变的话用它就挺好, 只占一个drawcall。
最后是本文的下载地址:http://vdisk.weibo.com/s/sCouU
另外感谢楼下回复我的这个哥们, 这几天我要尝试一下shadowsmap了 哇咔咔。。
- 本文固定链接: https://www.xuanyusong.com/archives/2132
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
松神你好,请教一下,若是用OnRenderImage()做摄像机特效的话,如果相机Clear Flags使用Depth Only模式,项目会变得很卡,特别是发到移动平台上,这个是为什么,怎么解决它不卡呢
摄像机特效为啥不直接在NGUI上做?
首先谢谢你的回答,我是想要给一个3D物体加一个效果以表示我选中了它,而这个3D物体是单独用一个相机显示的,所以才有用到摄像机特效,如此便出现了相机Clear Flags使用Depth Only模式,用OnRenderImage()做摄像机特效,项目会变得很卡,特别是发到Ipad上
我也遇到了,解决了么
我也遇到了,解决了吗
我也遇到了这个问题,用OnRenderImage()会特别卡!!!
解决了吗这个问题!!!
使用ShadowMap技术可以在Unity中实现动态阴影
MoMO大神 如果是想实现有阴影投射 但是看不到地面 应该怎么做呢
我以为是相机来的,原来是 GUI.DrawTexture
momo大: 左上角的那个渲染相机怎么去掉呢?
支持雨凇MOMO,俺来学习喽。大家多多留言交流啊。
请问下,在4.1.0版本中没有找到RenderTexturea,PC动态阴影如何实现?
为毛 为毛 。momo你说为毛我的代码下载下去导入然后就是这个鸟样
少废话下载下来开始研究咯。喂喂,我在新公司又遇到挫折了咋办烦死了
Nexus7 不是华硕的么。。。
強大阿這篇~受教了老師們
哈哈哈!!
雨松大神,你对亚马逊的应用内计费unity插件了解吗?我现在遇到的问题是unity插件中带的例子运行的时候没有一个回调函数执行的,不知道是怎么回事,望指教!
不好意思 我没做过这个 呵呵
没事,还是要谢谢你
nvidia曾经在u3d北京开发者大会上介绍过动态伪实时阴影 的做法。可以应用到移动平台。就是你说的这样哇哈哈。
主要的难点就是处理投射在凹凸不平的地面上的效果。。。
那只有用Shader实时计算阴影了,那个效果是最真实最好的了。
那么,请问神庙逃亡2的ios版是用神庙引擎做的,很炫。
嗯嗯。 确实很炫,, 不过阴影应该是自己写的。。 而你你仔细看 它的模型本身是不接受阴影的。。 跑到一个比较暗的地方你仔细观察一下模型身上就能看出来。。
我也觉得是阴影做的2D动画,然后和主角的动画绑定在一起的。就是主角idle,阴影动画也是idle,主角jump,阴影也是jump动画,这个是可以做的。
可能不是 因为要处理凹凸不平的地面。。
1zp1vl,,热销儿童-卡通袜子-卡通内裤-卡通拖鞋
热销儿童-卡通袜子-卡通内裤-卡通拖鞋http://item.taobao.com/item.htm?
id=20376504798 癸巳年(蛇)二月初一 2013-3-12
momo讲一下如何防止物理穿透,我发现就算加了物理特性,某些时候还是会有穿透的现象,非常诡异。
“太物理了”,, 所以有时间需要用代码协助一下物理引擎。。。
Unity3D的大神越来越多了!向你们致敬,向你们学习!
j7pf77,,热销儿童-卡通袜子-卡通内裤-卡通拖鞋
热销儿童-卡通袜子-卡通内裤-卡通拖鞋http://item.taobao.com/item.htm?
id=16169186933 癸巳年(蛇)正月三十 2013-3-11
你这种做法,其实就是传统的shadow map的前几步,把摄像机放灯光的位置进行渲染到纹理,渲染深度信息。 而余下来这张Depth纹理进行比较,得到遮挡关系,所以这层遮挡关系是像素级别。而你现在的做法,相当于不考虑遮挡关系,直接做阴影投射,毕竟只需要对主角渲染阴影,但是如果周围有建筑或者路不平,你很难在三角形级别去计算这层遮挡关系。。必然导致阴影Quad Mesh穿插。其实你可以再Camera上再加一个Projector,这样不用去对阴影的那个四边形做变化,相当于多一个Pass直接投射阴影到其他物件上,但是我测试过在Android设备上…Projector对地形的效率影响特别大,特别是Terrain的贴图已经四张。
感谢你的回复。。。
我觉得temprun的阴影应该也是向你说着这种方法。unity3d的阴影应该是通过硬件层面计算的, 所以部分android手机是没有阴影的。。
恩,应该是要Shader支持的,之前看过开源引擎irrlicht的一个插件的做法,就是用Shader脚本实现的。平面正交矩阵运算是最简单的了,好比遇到墙角就露馅了。地面凹凸不平、光线的角度问题。要不momo也写个Shader,阴影问题就全搞定了,我反正是写不出来的,有点复杂的。
我问过一些朋友 就出来效率非常低下。。 我觉得不如做个假阴影得了。。
恩,我也觉得手机里面“Blob Shadows Projector”已经完全够用了。Angry bots也只是这种效果,其实影响画面效果的有很多方面,阴影只是一个方面。第一个方法我试了蛮好的,不过追求完美的话还是要添加Blob Shadows Projector的Shader,可以让人物的阴影更有层次感,这样就可以作为一个增强型的“Blob Shadows Projector”来使用了,赞一个,我已经用到我项目里了,非常不错。
貌似左上角有个侧面投影图片。。。另外问momo一个问题:Project里面如果没用到Hierarcy的模型、材质和贴图会影响最终输出的可执行文件的大小吗?还是没有用到的资源需要删除掉?
呵呵 希望常来讨论。。。
不错的东西
感谢支持 蛤蛤。。