Unity的unity5 实时阴影影效率低吗

unity native2d 如何实现这种实时阴影的效果呢_unity吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:22,478贴子:
unity native2d 如何实现这种实时阴影的效果呢收藏
Unity5.0不用场景烘焙,支持时时阴影
如果你想阴影效果时时,你可以在物体上添加一个阴影预设,这样阴影可以时时跟随物体
登录百度帐号推荐应用Unity3d代码及效率优化总结 - 简书
Unity3d代码及效率优化总结
最简单的优化建议:
1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU。2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unlit目录下的。它们更高效。3.尽可能共用材质。4.将不需要移动的物体设为Static,让引擎可以进行其批处理。5.尽可能不用灯光。6.动态灯光更加不要了。7.尝试用压缩贴图格式,或用16位代替32位。8.如果不需要别用雾效(fog)9.尝试用OcclusionCulling,在房间过道多遮挡物体多的场景非常有用。若不当反而会增加负担。10.用天空盒去“褪去”远处的物体。11.shader中用贴图混合的方式去代替多重通道计算。12.shader中注意float/half/fixed的使用。13.shader中不要用复杂的计算pow,sin,cos,tan,log等。14.shader中越少Fragment越好。15.注意是否有多余的动画脚本,模型自动导入到U3D会有动画脚本,大量的话会严重影响消耗CPU计算。16.注意碰撞体的碰撞层,不必要的碰撞检测请舍去。1.为什么需要针对CPU(中央处理器)与GPU(图形处理器)优化?CPU和GPU都有各自的计算和传输瓶颈,不同的CPU或GPU他们的性能都不一样,所以你的游戏需要为你目标用户的CPU与GPU能力进行针对开发。2.CPU与GPU的限制GPU一般具有填充率(Fillrate)和内存带宽(Memory Bandwidth)的限制,如果你的游戏在低质量表现的情况下会快很多,那么,你很可能需要限制你在GPU的填充率。CPU一般被所需要渲染物体的个数限制,CPU给GPU发送渲染物体命令叫做DrawCalls。一般来说DrawCalls数量是需要控制的,在能表现效果的前提下越少越好。通常来说,电脑平台上DrawCalls几千个之内,移动平台上DrawCalls几百个之内。这样就差不多了。当然以上并不是绝对的,仅作一个参考。往往渲染(Rendering)并不是一个问题,无论是在GPU和CPU上。很可能是你的脚本代码效率的问题,用Profiler查看下。关于Profiler介绍:http://docs..com/Documentation/Manual/Profiler.html需要注意的是:在GPU中显示的RenderTexture.SetActive()占用率很高,是因为你同时打开了编辑窗口的原因,而不是U3D的BUG。3.关于顶点数量和顶点计算CPU和GPU对顶点的计算处理都很多。GPU中渲染的顶点数取决于GPU性能和SHADER的复杂程度,一般来说,每帧之内,在PC上几百万顶点内,在移动平台上不超过10万顶点。CPU中的计算主要是在蒙皮骨骼计算,布料模拟,顶点动画,粒子模拟等。GPU则在各种顶点变换、光照、贴图混合等。【个人认为,具体还是看各位的项目需求,假设你项目的是3d游戏。你游戏需要兼容低配置的硬件、流畅运行、控制硬件发热的话,还要达到一定效果(LIGHTMAP+雾效),那么顶点数必定不能高。此时同屏2W顶点我认为是个比较合适的数目,DRAWCALL最好低于70。另,控制发热请控制最高上限的帧率,流畅的话,帧率其实不需要太高的。】4.针对CPU的优化——减少DRAW CALL 的数量为了渲染物体到显示器上,CPU需要做一些工作,如区分哪个东西需要渲染、区分开物体是否受光照影响、使用哪个SHADER并且为SHADER传参、发送绘图命令告诉显示驱动,然后发送命令告诉显卡删除等这些。假设你有一个上千三角面的模型却用上千个三角型模型来代替,在GPU上花费是差不多的,但是在CPU上则是极其不一样,消耗会大很多很多。为了让CPU更少的工作,需要减少可见物的数目:a.合并相近的模型,手动在模型编辑器中合并或者使用UNITY的Draw call批处理达到相同效果(Draw call batching)。具体方法和注意事项查看以下链接:Draw call batching : /Documentation/Manual/DrawCallBatching.htmlb.在项目中使用更少的材质(material),将几个分开的贴图合成一个较大的图集等方式处理。如果你需要通过脚本来控制单个材质属性,需要注意改变Renderer.material将会造成一份材质的拷贝。因此,你应该使用Renderer.sharedMaterial来保证材质的共享状态。有一个合并模型材质不错的插件叫Mesh Baker,大家可以考虑试下。c.尽量少用一些渲染步骤,例如reflections,shadows,per-pixel light 等。d.Draw call batching的合并物体,会使每个物体(合并后的物体)至少有几百个三角面。假设合并的两个物体(手动合并)但不共享材质,不会有性能表现上的提升。多材质的物体相当于两个物体不用一个贴图。所以,为了提升CPU的性能,你应该确保这些物体使用同样的贴图。另外,用灯光将会取消(break)引擎的DRAW CALL BATCH,至于为什么,查看以下:Forward Rendering Path Details:/Documentation/Components/RenderTech-ForwardRendering.htmle.使用相关剔除数量直接减少Draw Call数量,下文有相关提及。5.优化几何模型最基本的两个优化准则:a.不要有不必要的三角面。b.UV贴图中的接缝和硬边越少越好。需要注意的是,图形硬件需要处理顶点数并跟硬件报告说的并不一样。不是硬件说能渲染几个点就是几个点。模型处理应用通展示的是几何顶点数量。例如,一个由一些不同顶点构成的模型。在显卡中,一些集合顶点将会被分离(split)成两个或者更多逻辑顶点用作渲染。如果有法线、UV坐标、顶点色的话,这个顶点必须会被分离。所以在游戏中处理的实际数量显然要多很多。6.关于光照若不用光肯定是最快的。移动端优化可以采用用光照贴图(Lightmapping)去烘培一个静态的贴图,以代替每次的光照计算,在U3D中只需要非常短的时间则能生成。这个方法能大大提高效率,而且有着更好的表现效果(平滑过渡处理,还有附加阴影等)。在移动设备上和低端电脑上尽量不要在场景中用真光,用光照贴图。这个方法大大节省了CPU和GPU的计算,CPU得到了更少的DRAWCALL,GPU则需要更少顶点处理和像素栅格化。Lightmapping : /Documentation/Manual/Lightmapping.html7.对GPU的优化——图片压缩和多重纹理格式Compressed Textures(图片压缩):/Documentation/Components/class-Texture2D.html图片压缩将降低你的图片大小(更快地加载更小的内存跨度(footprint)),而且大大提高渲染表现。压缩贴图比起未压缩的32位RGBA贴图占用内存带宽少得多。之前U3D会议还听说过一个优化,贴图尽量都用一个大小的格式(512 * 512 , 1024 * 1024),这样在内存之中能得到更好的排序,而不会有内存之间空隙。这个是否真假没得到过测试。MIPMA(多重纹理格式):/Documentation/Components/class-Texture2D.html跟网页上的略缩图原理一样,在3D游戏中我们为游戏的贴图生成多重纹理贴图,远处显示较小的物体用小的贴图,显示比较大的物体用精细的贴图。这样能更加有效的减少传输给GPU中的数据。8.LOD 、 Per-Layer Cull Distances 、 Occlusion CullingLOD (Level Of Detail) 是很常用的3D游戏技术了,其功能理解起来则是相当于多重纹理贴图。在以在屏幕中显示模型大小的比例来判断使用高或低层次的模型来减少对GPU的传输数据,和减少GPU所需要的顶点计算。摄像机分层距离剔除(Per-Layer Cull Distances):为小物体标识层次,然后根据其距离主摄像机的距离判断是否需要显示。遮挡剔除(Occlusion Culling)其实就是当某个物体在摄像机前被另外一个物体完全挡住的情况,挡住就不发送给GPU渲染,从而直接降低DRAW CALL。不过有些时候在CPU中计算其是否被挡住则会很耗计算,反而得不偿失。以下是这几个优化技术的相关使用和介绍:Level Of Detail :/Documentation/Manual/LevelOfDetail.htmlPer-Layer Cull Distances :/Documentation/ScriptReference/Camera-layerCullDistances.htmlOcclusion Culling :/Documentation/Manual/OcclusionCulling.html9.关于Realtime Shadows(实时阴影)实时阴影技术非常棒,但消耗大量计算。为GPU和CPU都带来了昂贵的负担,细节的话参考下面:/Documentation/Manual/Shadows.html10.对GPU优化:采用高效的shadera.需要注意的是有些(built-in)Shader是有mobile版本的,这些大大提高了顶点处理的性能。当然也会有一些限制。b.自己写的shader请注意复杂操作符计算,类似pow,exp,log,cos,sin,tan等都是很耗时的计算,最多只用一次在每个像素点的计算。不推荐你自己写normalize,dot,inversesqart操作符,内置的肯定比你写的好。c.需要警醒的是alpha test,这个非常耗时。d.浮点类型运算:精度越低的浮点计算越快。在CG/HLSL中--float :32位浮点格式,适合顶点变换运算,但比较慢。half:16位浮点格式,适合贴图和UV坐标计算,是highp类型计算的两倍。fixed: 10位浮点格式,适合颜色,光照,和其他。是highp格式计算的四倍。写Shader优化的小提示:/Documentation/Components/SL-ShaderPerformance.html11.另外的相关优化:a.对Draw Call Batching的优化/Documentation/Manual/DrawCallBatching.htmlb.对Rendering Statistics Window的说明和提示:/Documentation/Manual/RenderingStatistics.htmlc.角色模型的优化建议用单个蒙皮渲染、尽量少用材质、少用骨骼节点、移动设备上角色多边形保持在300~1500内(当然还要看具体的需求)、PC平台上内(当然还要看具体的需求)。Unity3D代码及效率优化总结1、在使用数组或ArrayList对象时应当注意length=myArray.Lfor(inti=0;i{}避免for(inti=0;i{}2、如果没有必要每帧都处理,则可以每隔几帧处理一次voidUpdate(){if(Time.frameCount%6==0) { DoSomething(); }}3、定时重复调用可以使用InvokeRepeating函数实现,比如,启动0.5秒后每隔1秒执行一次 DoSomeThing 函数:voidStart(){InvokeRepeating("DoSomeThing", 0.5f, 1.0f);}4、少使用临时变量,特别是在Update OnGUI等实时调用的函数中。voidUpdate(){Vector3pos=transform.}可以改为:privateVector3voidUpdate(){pos=transform.}5、主动进行垃圾回收voidUpdate(){if(Time.frameCount%50==0){System.GC.Collection();}}6、优化数学运算,尽量避免使用float,而使用int,特别是在手机游戏中,尽量少用复杂的数学函数,比如sin,cos等函数。改除法/为乘法,例如:使用x*0.5f而不是 x/2.0f 。7、压缩 Mesh导入 3D 模型之后,在不影响显示效果的前提下,最好打开 Mesh Compression。
Off, Low, Medium, High 这几个选项,可酌情选取。对于单个Mesh最好使用一个材质。8、 运行时尽量减少 Tris 和 Draw Calls预览的时候,可点开 Stats,查看图形渲染的开销情况。特别注意 Tris 和 Draw Calls 这两个参数。
一般来说,要做到:
Tris 保持在 7.5k 以下
,Draw Calls 保持在 35 以下。9、避免大量使用 Unity 自带的 Sphere 等内建 MeshUnity 内建的 Mesh,多边形的数量比较大,如果物体不要求特别圆滑,可导入其他的简单3D模型代替。10、如果可能,将GameObject上不必要的脚本disable掉。如果你有一个大的场景在你的游戏中,并且敌方的位置在数千米意外,这是你可以disable你的敌方AI脚本直到它们接近摄像机为止。一个好的途径来开启或关闭GameObject是使用SetActiveRecursively(false),并且球形或盒型碰撞器设为trigger。11、删除空的Update方法。当通过Assets目录创建新的脚本时,脚本里会包括一个Update方法,当你不使用时删除它。12、引用一个游戏对象的最合乎逻辑的组件。有人可能会这样写someGameObject.transform,gameObject.rigidbody.transform.gameObject.rigidbody.transform,但是这样做了一些不必要的工作,你可以在最开始的地方引用它,像这样:privateTransform myTvoid Start(){myTrans=}13、协同是一个好方法。可以使用协同程序来代替不必每帧都执行的方法。(还有InvokeRepeating方法也是一个好的取代Update的方法)。14、尽可能不要再Update或FixedUpdate中使用搜索方法(例如GameObject.Find()),你可以像前面那样在Start方法里获得它。15、不要使用SendMessage之类的方法,他比直接调用方法慢了100倍,你可以直接调用或通过C#的委托来实现。16、使用javascript或Boo语言时,你最好确定变量的类型,不要使用动态类型,这样会降低效率,你可以在脚本开头使用#pragmastrict 来检查,这样当你编译你的游戏时就不会出现莫名其妙的错误了。
狗狗,被黑了新人求教,关于场景实时阴影【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:73,680贴子:
新人求教,关于场景实时阴影收藏
我使用U3D 4.3破解版。在场景中添加了平行光并设置了Shadow Type 为soft shadow摄像机的Rendering Path为ForwardPlayer-&Other settings-&Rendering path为Deferred lighting。仍然没有实时阴影,使用lightmapping洪培可以洪培出阴影来。我是想先利用实时阴影打好灯光,然后在洪培出来。请教各位大神要如何做呢?
在吗 你那个时时阴影的问题解决了吗? 我也遇见相同的问题 解决的话可以告诉下方法吗?
看看品质设定里边是不是勾了阴影
登录百度帐号推荐应用Unity3D手游实时阴影方案
我的图书馆
Unity3D手游实时阴影方案
阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影,也是这种技术,在电脑上很成熟的.我也是目睹了阴影技术的发展,以前也自己写过一些阴影,本来以为以后再也不用担心阴影了,结果做移动游戏以后,发现情况没那么乐观.这种基于深度的shadow map 技术,需要浮点纹理的支持,但有的移动平台不支持浮点纹理,即使支持,这种技术开销也特别大.所以我们需要重新思考,移动平台到底什么样的阴影方案比较合适.
我把常见的实时阴影技术分3个大的类别,逐一分析.
1. 基于模板的体积阴影
基于模型边缘的,模型需要特别处理,正是由于基于模型边缘的,属于顶点级别,而不是像素级别,导致不能支持alpha test,比如主角的翅膀.放弃
2. 基于投影Projector的shadow map
基于投影的,投影纹理,需要RenderTexture,支持alpha test,
但是这种技术也有很多问题,比如反向投影(可加一张fall of 纹理解决), 多重投影(比如桥上和桥下),等等
阴影质量和RenderTexture纹理大小关闭很大,如果要一张RenderTexture纹理渲染很多角色,纹理就要大一些,要处理阴影边缘,
但是用来处理单个角色,就能避免很多问题.可考虑.
3. 基于深度Depth的shadow map
Unity自带的就是这种,保存深度需要浮点纹理,但是有的手机不支持,且开销很大,不考虑.
通过以上分析,再结合自己游戏的实际情况,45度视角游戏,我最后定的方案是:
1.只有主角采用基于投影Projector的shadow map
2.其他角色,采用最简单的阴影面片绑在脚下.(如果怪物被击浮空,就隐藏面片,落地再显示,防止穿帮)
这样的好处是,既有实时阴影,又保证了效率.
1.视野内全部角色基于投影Projector的shadow map
很简单,先渲染角色到RenderTexture,再用Projector投影到地面.
1.投射shader:
Shader&"Luoyinan/Projector/ShadowCast"&&&{&&&&&&&Properties&&&&&&&{&&&&&&&&&&_ShadowColor&("Main&Color",&COLOR)&=&(0.5,&0.5,&0.5,&1)&&&&&&}&&&&&&&&SubShader&&&&&&&{&&&&&&&&&&Pass&&&&&&&&&&&{&&&&&&&&&&&&&&Color&[_ShadowColor]&&&&&&&&&&}&&&&&&}&&}&&
2.接收shader:
Shader&"Luoyinan/Projector/ShadowReceive"&&&{&&&&&&&Properties&&&&&&&{&&&&&&&&&&_Color&("Main&Color",&Color)&=&(1,1,1,1)&&&&&&&&&&_ShadowTex&("Cookie",&2D)&=&""&{}&&&&&&&&&&_MaskTex&("Mask",&2D)&=&""&{}&&&&&&}&&&&&&&&&&&&&Subshader&&&&&&&{&&&&&&&&&&Tags&{"Queue"="Transparent"}&&&&&&&&&&Pass&&&&&&&&&&&{&&&&&&&&&&&&&&ZWrite&Off&&&&&&&&&&&&&&Fog&{&Mode&Off&}&&&&&&&&&&&&&&ColorMask&RGB&&&&&&&&&&&&&&Blend&DstColor&Zero&&&&&&&&&&&&&&Offset&-1,&-1&&&&&&&&&&&&&&&&&&&&&CGPROGRAM&&&&&&&&&&&&&&#pragma&vertex&vert&&&&&&&&&&&&&&#pragma&fragment&frag&&&&&&&&&&&&&&#include&"UnityCG.cginc"&&&&&&&&&&&&&&&&&&&&&&&&&&&&struct&v2f&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&float4&uvShadow&:&TEXCOORD0;&&&&&&&&&&&&&&&&&&float4&pos&:&SV_POSITION;&&&&&&&&&&&&&&};&&&&&&&&&&&&&&&&&&&&&&&&&&&&float4x4&_P&&&&&&&&&&&&&&v2f&vert&(float4&vertex&:&POSITION)&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&v2f&o;&&&&&&&&&&&&&&&&&&o.pos&=&mul&(UNITY_MATRIX_MVP,&vertex);&&&&&&&&&&&&&&&&&&o.uvShadow&=&mul&(_Projector,&vertex);&&&&&&&&&&&&&&&&&&return&o;&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&sampler2D&_ShadowT&&&&&&&&&&&&&&sampler2D&_MaskT&&&&&&&&&&&&&&fixed4&frag&(v2f&i)&:&SV_Target&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&fixed4&texM&=&tex2Dproj(_MaskTex,&UNITY_PROJ_COORD(i.uvShadow));&&&&&&&&&&&&&&&&&&fixed4&texS&=&tex2Dproj(_ShadowTex,&UNITY_PROJ_COORD(i.uvShadow));&&&&&&&&&&&&&&&&&&texS.rgb&+=&texM.&&&&&&&&&&&&&&&&&&&&return&texS;&&&&&&&&&&&&&&}&&&&&&&&&&&&&&ENDCG&&&&&&&&&&}&&&&&&}&&}&&
1. RenderTexture尽量简单,大小最好不要超过512,格式用没alpha通道的565,关闭抗锯齿,因为只渲染单一颜色,可关闭深度,
2. 阴影投射的shader尽量简单,为了效率,我的shader没用主纹理,所以不支持alpha test.如要支持,可自行修改shader.
3. 阴影摄像机看到的对象比游戏主摄像机看的多一些,只让主摄像机看到的对象才产生阴影.能少渲染几个角色.用OnBecameVisible来实现.
4. 为了避免反向投影穿帮,阴影方向尽量不要太斜.
5. 远处的阴影边缘衰减,用一张掩码纹理:
最终效果,可以看到远处的阴影自然衰减,也能投影到斜坡上,:
TA的最新馆藏
喜欢该文的人也喜欢Unity3D实时阴影-Projector投影器
要在Android端做一个类似投影寻真的Demo,做一个用手电筒动态投影,但是使用Unity3D的Spotlight,各种调试参数,将PlayerSetting的Rendering
path设为Deferred Lighting,并将Camera的Rendering path设为Deferred
Lighting,在pc端能实现Spotlint的投影效果,但是移植到移动端就白瞎了,折腾了好久,使用投影器Projector实现了自己想要的效果,不废话,走起。
1、导入Projector包;
2、给投影目标物体添加一个Camera,让Camera的视觉角度和物体在一条直线上,Camera的视觉方向就是物体的投影方向(因为最后要把Camera的RenderTarget投影到墙上),并将Camera渲染剔除,只让Camera捕获目标物体;
3、创建一个空的OBJ,即:Create
Empty,然后给他添加Projector组件,让其投影方向指向要生成投影的地方;
4、创建一个RenderTexture(MyCameraRender),赋给Camera的TargetT
5、创建一个Material(MyMaterial),把步骤4中的MyCameraRender赋给MyMaterial;
6、选中步骤3中的Projector,将步骤5中的MyMaterial赋给Projector的Material属性,最后将Projector的Shader改为Projector包中自带的Light或Multiply(Shader)即可。
如此,动态投影大功告成!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 unity 实时阴影 的文章

 

随机推荐