140141jyz4uijezj1nh1z0.jpg
  在5月13日的Unite2017案例分享大会上,莉莉丝技术美术总监李靖分享了如何在移动平台打造自适应画质的游戏。以下内详细内容

  大家好,非常荣幸这次Unity邀请我参加这次分享会。也很高兴,跟各位见面。我是技术美术,在这个行业工作了18年左右的样子,一直是在这个领域,所以可能有些心得,可以和大家分享一下。今天这个题目是怎样去制作一些能够自适应不同机种画面的游戏,或者是其他的一些多媒体方面的东西。

  所以我今天会说到大概有三个模块,第一个模块是会介绍一些和硬件,或者和软件,其实就是和使用环境相关的知识点。然后第二块,可能会说一些在制作这一类需求的时候,应该注意的技巧和知识,第三块是我个人在工作中总结出来的一部分工作的一些实例。

  我们先从第一部分开始,其实就是,因为现在的手机平台是已经发展了好多年了。硬件的种类应该说是非常之多,多到什么程度呢?多到这个设备几乎没办法统计了,至少个人没办法统计,能力有限。分几块,这几块都是和我们要做不同画质的游戏相关的一些硬件的支持。第一块就是Soc,Soc是什么,Soc不是CPU,Soc包括CPU。简单一点来讲,就是在一块芯片上集成了几乎整套系统,像高通的,我这边有一个高通的例子,其实就包括了显示试配的芯片,包括GPS定位的一些芯片。还有联发科(音)的芯片,还集成了内存,这个内存非常容易和CPU、GPU封装在一起,合成一整个芯片然后给到厂商去使用。

  这点来说,其实非常之好,但是千万不要认为,我是手机里只有一个CPU,其他的都是分开的设备。如果是这样的认为,可能针对性的优化就非常难去实现了。

  我们来说第二个,GPU,当年这个领域是列强纷争,现在能够存活下来,基本只有这三家,还有在后面会提到的另外一家,这三家,一是Imagination,这是最最有名的,因为它是苹果设备的GPU的官方授权商。当然它在安卓上也有一部分的客户,尤其是联发科,会使用其部分的GPU,另外两家基本是独家,高通一个有AdrenoGPU,这是整个ati移动图形部门收编后新的产物,第三就是ARM自己做的mali。前面还提到一个,相对目前在移动平台上使用不是那么广但作为在PC显卡是行业老大的nvidia,但是在移动设备上功耗我觉得做的还是稍稍欠缺一些,所以说厂家选择它的可能性比较小。

  这里是和内存相关的,但是我这边没有写内存,而是它的一个极其重要的指标,带宽。这边有一张图,可以看到从2016年到2018年,PC端的那个主流的内存是DDR4,显卡所用到比较主要,GDDR5,Y轴都是以Gbps为单位的。手机内存会用到的是中间那条绿线,它的内存的带宽远远小于桌面级的GPU,这也就代表在移动设备上,我们开发那些图像类的作品,完全会受限于带宽。

  右图右侧相对于带宽指标也重要,就是耗电性,这就是为什么带宽在移动设备上不够大,因为要考虑耗电,手机由电池供电,不是PC插一个电源随便用没关系,不是这样。电池耗尽了,用户体验就很糟糕,大家都抱怨苹果手机、安卓手机都只能一天一充,为什么诺基亚时代的神话没有了,就跟我们使用硬件的规格越来越高,越来越难控制,是有关系。这些东西都是一些硬件上的知识,可以对于你做优化有很大的帮助。

  有很不同类型的硬件,如果把所有组合加起来会上千种,但是都有同样的问题就是发热还有电池消耗,这是一个恶性循环,越发热电池消耗更快,更发热电池消耗也更快,然后电池没电了,游戏结束了。我们做弹性画质的目的,其实一部分也为了避免这样的问题,可以尽量延长玩家的设备的使用时间,在某些情况下,可能会牺牲画质,或者是其他的方式来实现,所以这个对于用户体验来说还是很重要的。

  前面大概综述了一下硬件上的不同,对于我来说那些点需要注意,其实还有第二块就是软件上的,软件的话,首先从操作系统层面来说,是IOS和安卓,目前来说永远不会变的两个主题了。两个系统,其实都不错,但是完全不一样。IOS封闭,好处是开发会很容易,因为设备的碎片化也没有那么厉害,并且对于后台进程的管理等等都非常严格,所以不会产生那种后台的进程在拼命地影响前台,或者说是消耗CPU、GPU资源的状态。

  但是安卓的话,因为比较开放,它可以给开发者带来很多想象力,可以做很多苹果上面做不了的事情,确实是这样。但是它也有缺点,就是它的生态来说,会相对比较混乱一点。可能只有部分厂家会去完全根据安卓的那套规范去做产品。有些不好的小市场,可能会很多东西,带来的问题就是你的手机耗电非常快,并且在运行你的前台程序的时候,发现效率往往是和这个级别的硬件是不成正比的。这就是操作系统上带来最大的问题。

  还有不同的是,Graphics API,这是跟驱动仅仅相关,API是需要显卡驱动,很少有人在一平台上提到显卡去这个,但是确实存在,任何硬件都是需要软件去驱动的,只不过不像PC端大家会说,现在N卡、A过升级驱动,游戏跑的更快了,他们做了一些优化。其实在手机平台上,同样有驱动这个概念。但是它的驱动是整合在系统里面,所以一般用户没有办法升级它。所以如果需要新的Graphics API,其实需要驱动的升级支持,比较传统是PC平台微软的DirectX还有OpenGL,通过OpenGl我们有一了opengl es版本,但是这很古老了,还是上时代的产物,所以像苹果及OpenGL基金会都忍不住,也开发了全新的api,苹果的是Metal大家都在用,Iphone5S就已经支持。OpenGL基金会开发出的新api vulkan也已经出现在今年的新设备上了,这些新时代的api给大家带来的好处就是,可以提供新的画质上的提升点,同时还可以提高渲染的效率,这可以让电池耗的更慢,这个外面有一个Mali展台,他们有这方面的展示,就是解释这个能源消耗的一个问题。

  软件有很多不同,Unity带来给我们什么,Unity带给我们相同的语法,这个帮助极大,如果用其他类型的编辑器引擎的话,可能就要维护多一些,这个成本其实是非常可观的。它的语法很简单,先定义属性,其次subshader块,再通过标签,通过pass来区分,渲染的顺序,包括渲染的状态等等。

  综上所述,尤其是安卓设备,也包括苹果,(苹果的设备已经有十年了,大家很期待十周年版Iphone,其实已经有很多分支了。)那么多分支,首先我们要预知到,当前的硬件设备是属于哪个级别,如果知道了,你可以进行下一步操作,针对不同的因素,可以做减法,或者针对更高的,可以做怎样的加法,所以首先IOS比较简单,Unity本身就提供,你只要用这个函数返回一下就知道当前的设备是什么,是属于第几代Iphone,或者第几代Ipad,对于安卓来说,跟前面说的生态有直接的关系,就一下子变复杂,话题很沉重了。

  但是Unity提供一部分的功能,你可以通过UnityEngine.Systeminfo可以获得想要的东西,包括CPU,最大的显存,包括CPU架构,CPU的频率这一类,但是其实你光用这一类,这些东西综合出一套自己的算法,来评估的话,其实还不够。我觉得最总重要的是通过维基百科这个平台定义一份自己的表格,这是最重要的,这边可以给我显示一下表格吗?因为现在大部分游戏都有配表,这是一张设备适配表,大家看第一屏,第一屏是把它分成了有叫设备,还有是GPU,后面有一个LV,然后是注释,这都是IOS的设备,大家看我分成这些档。因为IPhone每一代都是一个SOC,通过查维基百科上,这一类的GPU的Gflops是多少级,这是第一点。

  第二点,它支持3.0还是2.0,显存最多有多少,通过这一点,我可以得到一个结果。现在分类是,大家可以看到LV有一些负一,负一的意思,在我这边其实就是我测试机最低标准以外,可能会有不兼容的状态,并且他们都很低端,都是opengl es2.0。我开发的一些图形上的特性,可能使用的都是es3.0以上,这些机器基本上可以排除掉。或者以后,根据需要进行支持,通过写一些扩展,或者其他的方式,来增量解决兼容性的问题。现在最新是iphone7Plus,显示的效果会不太一样。Ipad也是一样,也是同样的一个逻辑。

  这边大家看到,设置这一栏没有东西了,因为安卓你如果去用设备来分的话,你这个表就非常非常长,可能上千,甚至于上万,我觉得没有意义,并且不可能统计。我用GPU来统计,GPU统计相对容易一点,尤其是高通和power vr,高通每代对应的GPU是不一样,能很清楚这个相对应的SOC是什么,大家都知道,今后因为苹果和power vr合同解除的关系,imagination必然越来越加强安卓阵营的投入。联发科的新soc Xelio30,包括其他后续的产品,很多都是PowerVR GPU,还有Mali的GPU,这个也很容易区分,高低的档次,像mali 400系列,T600系列,T700系列,包括现在的GT系列,非常容易分,但是为了更加精确。

  所有这些信息,包括厂商,SOC细节等,在wikipedia上都有,我认为有想法的人可以整和成更完美的表格。譬如打开wiki就可以查到,现在的SOC,都什么制程,GPU核心是什么,等等都能取得,通过这个有一个非常好的,比较详尽的档次表。光有这点还不够,还要去使用自己算的表格,如果这些条件都没有达成,那这个机器怎么处理,譬如新出了Iphone8,厂商没有及时出更新自己的表格,这边认出来就是Iphone unknow,所以需要再制定一些规范,这个cpu主频怎么样,内存有多少,这些方法来决定这台机器可以显示什么效果。

  前面关于软硬件的这个环境的这块,基本上都讲完了,其实最最重要的是,首先知道差异化,并且知道这些东西和图形渲染是直接相关,可能不一定需要知道太多的细节,因为并不是硬件工程师,也不是做系统,也不是做驱动的,我们是做产品的。需要能够判断出什么是好硬件,什么是坏硬件就可以了。免得盲目的优化! 这边其实也要稍稍吐槽一点,就是国外的硬件商相对硬件比较均衡一点,但是国内的稍微偏激一点,在某一块会做的比较主打,我这边是10核心的CPU,很棒,但是不提GPU,可能GPU就不是那么好。主打什么,那块肯定没问题,其他都是短板,这就造成很多机器的综合性能并不高。

  说到短板,到了第二环节,我们要做的是什么?我们要做的是让整个渲染的效率,不管从任何的环节来说,从任何面上来说,是没有木桶效应,一旦有木桶效应,就有瓶颈。其实最最常用,每天都会用到的工具就是Unity中的Profiler,这个非常好用,因为能看到非常多的信息,并且能够有一个大致的评估范围,比如说CPU里面,CPU这一块到底是什么东西比较费,是Rendering比较费,还是脚本比较费,还是物理比较费,都是非常明确显示在里面。并且CPU这块还能通过把左下栏那块表,细分出到底是什么函数比较费,可以做一些定位,如果切成另外一个界面。现在这个叫Heiruke(音),如果工程设置里面,设置成多线程渲染,就能看到现在的情况到底是CPU在等GPU,还是GPU完全不是压力,压力全部在CPU,因为多线程,渲染线程是分开,并且有一个事件waitingforpresent,这个事件告诉其他硬件gpu当前在忙,你就等我吧,等我结束了就告诉你了。通过这个例子其实很容易知道,当前开发这款产品,我是逻辑上出问题了,还是渲染的东西过多了,已经超过这个GPU能够承受的范围,很容易判别。

  包括Rendering,也会提供很多消息给我们,如果说我发现我们渲染的东西,GPU并不是很费,大部分时间都在CPU,看一下Rendering,这个也非常高,是不是没做batch(音),或者渲染的东西有问题,或者超标了,都会有问题。这种东西好处还在于可以连到真机进行调试,可以直接接上iphone,或者接上安卓都可以跑。像powervr的显卡如果顶点流超过范围,就会绘制两次,那时间就是双倍的,所以能看到详细信息。内存和我们这边就关系不大,略过。还有物理的也是一样,物理的话能够看得到,当前的激活状态的有多少,当然越多越费。但是这边也要提到一点,你是不是简单的造型,如果都是复杂的造型或凸面体当然很费,如果是简单的造型其实都还好。

  除了Unity内置的Profiler,如果需要更详尽的数据,(安卓选择最多)我这边推荐不是三大厂家的,而是Nvidia Tegra Graphcis Debugger,这个好处在于可以很容易查看一帧绘制的整个过程,并且可以看绘制的结果,就和Unity中的有一个功能是很像,带来的另外一个好处在于,你可以即时修改shader,这个时候就没有Unity的帮助,你得注意自己的语法,是GLSL的。还可以通过一些简单的参数的测试,比如说我不知道我现在的渲染的瓶颈到底在哪里,我试试看,把所有贴图就换了,点一下texture替换为2x2像素试试,啊就可以了,发现帧数好了,那我知道了,我的贴图有问题,贴图换成2乘2代表什么,代表你的带宽被撑满了,内存来不及传输了,你就知道针对点了,也知道应该怎么去干,对于比较低端的平台。

  还有的话,比如说我把深度测试关掉关掉,不比较Z,总之可以通过这样的排除法来替换,能知道我这个场景,我这个产品到底有什么问题在那边,这是一个方法。

  当然另外三大厂商的GPU也可以用,只不过会相对来说,麻烦一些,但是其实他们的用途作用都是一样的。除了使用Profiler工具以外,我们还知道一些知识点,只有这些知识点都被解决了,你的渲染才不会成为整个游戏的瓶颈。第一个其实解决Draw-CallS和batches,就把Unity中的标签打开,Unity在运行的时候,就会把这些标上Static的东西合并成一个,这个其实也是要看情况使用,不是说你把整个场景所有的东西全部合并效率就是最高的。因为我们还要考虑到一个内存的问题。因为Static batches有一个内存拷贝的问题,会生成另外一份合并的内存,原来的资源都是在的,会生成一个新的。一般不会占用太多,但如果做的游戏是针对非常非常低端的设备,可能内存本来就非常捉襟见肘。第二比较多的就是Dynamic batches,这个限制非常多,能够符合标准的那些物件,就是他们的材质是相同的,然后他们的transform,X、Y、Z ok,并且它们小于900 vertex attributes,非常严苛,就可以合并在一起。现在有一个方法是Instance rendering,使用相同的材质,可以批处理,这个其实是api相关,Opengles2.0就是不支持,我们可以使用这样相对比较高级的方式。但是这个需要大家去改动shader,才能实现的。标准的Unity里面有专门的shader支持instancing,这些可以做到批量绘制,但如果使用自定义shader,就是需要自己去维护。

  还有一个渲染的优先级来说,static模式最高效是最快的,第二个来说是instancing rendering,最后是Dynamicbatches,所以使用优化技术的时候,大家可以有一些侧重点。

  第二个支持点,是Overdraw,其实就是屏幕重绘,这是很可怕,因为业界还没有完全解决这个办法,因为和当前的图形学的基础优化方案是直接有关的。原因在于不透明的物件,renderer会写深度图,第二个不透明的物件,在画的时候,会比较深度,只有在深度合适的情况下,没有被剔除掉,才会画。但是透明不一样。透明因为不会去写深度,也就是你在屏幕上能看到多少透明,就画多少遍,可能会非常多。比如说我们做一个很简单的例子,往这个游戏摄像机的面前,扔一颗炸弹,这个炸弹其实在远处爆炸的时候,效果挺酷炫很棒,也不是很费。但是扔到屏幕前,可能就直接爆炸了,我是指设备爆炸,不是指炸弹爆炸。一下子把很稳定的35帧变成两帧三帧,这种情况都遇到过,针对这种问题,第一在制作的时候就严格注意半透明的层叠的数量,注意他们全部展开之后的总的像素的数量,这是很重要的一点。

  有一些方法规避掉这些现象,避免在镜头前出现非常多的半透明的,并在远处显示。

  还有一块会对性能产生极大影响,就是Shader,Shader是今天比较重点讲到的东西,shader在Unity,现在是两类surface shader 及 vertex fragment shader,surface shader它可以在非常顶尖的主机如Xbox1上跑流畅,也可以在PC上这种状态下有非常好的效果。但是针对的话,surface shader虽然做了非常多的优化,但是因为太通用,所以还是比较费,我个人主张,是对于手机平台的话,尽量使用vertex fragment Shader(音)。

  像素剔除默认就是把背面裁掉,但是有些情况,比如写了一个草的Shader,正反面都能显示,但是美术把这个shader用在建筑上,内部永远不会看到,这样的状态会导致有些情况下是两倍的输出,这个还是需要注意的。毕竟移动设备的GPUshader的流出率不是那么高,计算也差一些。

  接下来还有还是需要占带宽,会不会太多,导致带宽占满了,但是如果说,额外的深度操作就可以占满带宽。举一个例子来说,就是我所有东西都是不透明的,然后我画阴影,另外一个摄像机不同的角度,要重复画一遍深度图,那就是额外的带宽,可能就会导致翻倍。或者也有可能让你比较低端的机器的带宽就撑满了,就做不了其他的事了。

  还有一点是Ftime(音),如果这个设置不对,虽然是不可见,但是开销是实际存在的。

  还有一点就是叠加的模式,一旦你用叠加模式,也代表这个东西,一般是不太会有,因为这种情况非常少,你做半透明,你这个半透明后面被遮挡的东西,就没有了。你看到就是一个非常奇怪的景象,除非你需要这样的特效。

  下面有几点建议,就是尽可能把所有的计算放到顶点计算中,因为顶点计算比较省,而且现在的GPU,既能处理顶点,也能处理像素,因为就几年前,其实这些处理环节还是分开的。就是顶点的处理器是分开。大家都知道,像素的输出永远永远会比顶点要多得多,如果说我把所有计算都放到顶点上。顶点到像素之间做一个差值计算,就和你怎么说呢,一个点到另外一个点中间,线性做一些多度,类似这样的方式,把这个计算的结果,转换到这个级别,很多计算可以做简化,在这块,把它放到顶点。并且保证这个足够强大。

  现在手机虽然屏幕不大,再大也就是6寸7寸,但是像素的密度极高,分辨率非常高,2K,现在很多是2K的手机作为一个卖点,至少是1080P,可能中国的手机是720P。但是就算是1080P、720其实也是非常大的代价。1080乘720是多少像素点,如果屏幕上绘制三遍再乘3,这就是开销,直接可以公式化。还有一点尽量自己写,在有时间有这个预算的情况下,这个可以让你的效果表达更好一点,或者走的更节省一点。

  这边的话又提到带宽这个词,从这几个点来说,都会带来带宽上的问题。第一个是贴图的Filtering,就是过滤器,过滤器越高级,其实从3D世界,远近的角度来说,贴图做的越小,还原度会越高,并且和近处的高分辨里率的贴图之间的,就是过度的更平滑。但是带来的代价就是它是多重采样,并且有比较复杂一点的计算,而且这个没有太大的关系。因为这个是硬件级别,是直接可以处理的,但是会占用带宽。

  第二点是Mip-maps,在安卓上是有意义的,powervr的gpu上这个帮助会有一点,但是非常少,没有关系也不大,应为使用的渲染方式是deferred tiled base rendering,所以一定要注意这写问题,当然我指的都是3D物件的贴图,2D其实很多情况下大家都不用mipmaps,纯粹就是浪费。

  还有就是贴图大小。贴图大小,不光是占显存,还导致一个问题,就是传输会变慢,越是大的贴图,cache miss率会越高,导致传输效率更低,这都是恶性循环。还有一点,就是我们自定义的一些后期渲染用的postprocess,这个越少越好,这也就是为什么目前为止,比如说Unity到现在为止,没有建议可以让延时渲染这样的技术,跑在手机上,其实就是因为手机带宽永远不够,根本跑不动,那么高分辨率,同时3到4个gbuffer,没有那么大的带宽。

  带宽这个问题其实是在渲染的时候是经常会出现的一个瓶颈上的东西。我以前做主机类的游戏比较多一点,带宽很大,Xbox1的esram带宽非常大,但是内存很少,我们为了把一个游戏用延时渲染的方式需要的gbuffer塞进去就需要做了很多优化,用些技巧,如果放到主存,虽然能用,但延时就非常厉害,没有实用性。ps4用的主内存速度比较好,可以用全尺寸gbuffer,大家在手机上如果一定要做延时渲染,理论上来说也是可以的。但是只能用非常低的画面分辨率,所以大家不可能接受,这个画质会非常差,带来的好处不足以去弥补那些不好的地方。这边也提到了这个,这是前面说过的。

  第二个节点,基本上就是聊了一些知识点,这些知识点都是对于我们做弹性的画面是直接有影响的。其实我在设计整套系统,自己也会设计这样的东西,也会考量前面的点。现在就讲一下,我在莉莉丝这边实现这套系统的一些想法。这个功能,其实是有一个切入点,这个切入点在于guality setting,它这个可以把游戏的画质分为,是Fast、Good、等等,可以控制一些东西。第一个是pixel lighting接受的数量,在forward渲染的模式下,你的物件就以多pass的模式画下来,这样的话效率很低。在我这边的demo里面,低配全部是零,最多有一个,不包括太阳光,这还是需要。第二个贴图分辨率来说,有两个选项,第一种是全尺寸,第二是半尺寸,半尺寸在有些情况下解决带宽的问题。还有就是一些过滤方式,是不是基于每张图都做,还是强行都关闭,这个需求而异都可以。

  还有就是soft particle开销很大,会有额外的深度图的输出,其他的有一些选项开销都不是那么大所以没太大的关系,reflection probes我现在这个工程里面,我是没有去用到它,其实就是做一些反射的点,可以在场景里面有很多,并确实是实时更新这些probes,对CPU的负担肯定是很大的。然后还有下面这一块,在我的例子里面,shadow全部是自己实现的,所以在高中低配,把这些全部都禁掉。

  还有其他的选项,也会有帮助。像第一个是bone weights,这个是对于蒙皮的骨架数量控制,如果你用CPU蒙皮的话,这个选项的作用就很大,可以控制这个顶点到底由是多少个骨架

  影响,最终来实现那个运动。

  第二个是vsync,vsync手机上一般都不会去开,因为虽然可以帮助画面不撕裂,但是造成的问题是让帧数就要跌直接跌5帧以上,造成明显的卡顿。还有一点,我用比较多的是LOD Bia和Max LOD,这个我在后面会说到。包括Paticle 射线检测方面的这一块我会降到很低。

  还有下面就是异步加载的时间切片,你使用脚本去调用资源相关的东西,这类东西的话,目前在我这个Demo里面没有使用。

  先说说第一个,第一个其实就是LOD,这个其实对应的是前面那个LOD Bias里面的。LOD有几种,第一个是显示模型,就是和显示相关的物件,一类是静态模型,一类是蒙皮模型,就可以添加一个LODGroup的组件,有了这个之后,可以有多个模型,根据距离切换显示的等级,可能是越远越简单。通过LOD Bias可以控制这个系数。在最高配的机器上,可能50米以外才会切到第二个等级。但是如果说对于非常差的设备,我会把这个系数传的非常小,在5米以外就变成另外一个模型了。对于Particle来说,这块同样是适用的,使用它的话,就把一个完整的Particle system切成不同的分类,使用这个LODGroup,你可以在近距离的时候,显示的是相对精简过的。为什么与模型的方式不一样呢,这和overdraw相关。因为相对镜头最近的,比如说十米以内,不允许有很复杂的overdraw,必须很简单。十米到50米之间,全效果,50以后慢慢再精简,类似于这样的方法,可以既控制(英文),也能够让你的例子,在大部分的状态下,显示出完整的效果来,通过这种方式,这是一类。

  但是这类方式也有一个问题,就是所有的这一类,换了LodGroup,必然有一个计算距离,有什么办法可以一劳永逸吗?有一个小技巧,这张图上写的,有一类叫decorations,纯装是的和这个游戏本身的关卡、结构没有必然的联系,一类东西。我把它全部放到一个节点上,在低配或者中配的情况下,把部分的节点关掉,下面所有的东西都关掉,就不要显示浪费性能了。

  然后自己再写一点比较有扩展性的东西,我在这边,我把它扩展出了几类,在游戏中,人物我们的游戏人物比较小,在游戏上很小,所以这个人物不是真实的,但是会拿一个灯光的方向,根据matcap来算出受光面和背光面的效果,所以有人物这一块。然后还有全局上来说的话,我会使用到场景里面的ambient,但是Unity的ambient会比较多一点变化,比较复杂,所以我们直接提出来,这样的话可以做到,在游戏中,在不同的区域,可以有不一样的效果,它们互相之间可以转换。

  还有一类是shadow,因为我shadow完全重写,所以这块的话,我这边的设置全部在这边。还有一个反射源,我会Unity的reflection probes来生成出需要的资源,有时候会自己手动放一些cubemap在里面,在不同的区域,可以通过把这些做差值,计算出你到底是离哪一个点更近的混合的效果。这个其实可以用在很多种形式上,就是比较简单的反射的,水面或者PBR都可以用到,还有基于顶点的,可以放在这儿。

  还有这个面板是每个场景,都会有一个,当然也可以有多个,你只要放在那个,每个区域放一个,并且标记好位置,区域也是可以的。这样的话你在不同的位置,可能你全片滤镜是不一样,我这边还有一些全品滤镜的调整。

  这边其实就是这边也要写LOD,这个语法很简单,就是利用Shader Lab中的一个LOD的标签,这个有很多好处,第一个是兼容性很高,这个兼容性其实是两方面的。第一方面来说是只对于美术同学它的兼容性很高,不用高中低配,为了不同的模型指定不一样的模式,就是做其他的修改,只需要一个材质,这个材质自带LOD,你为这个材质所做所有变化,对于所有的低级的LOD都是有意义,这是一种方式,兼容性上的好处。

  第二种好处来说,因为这是Unity自带,因为Unity原生的shader都有标好了级别的,这个上官网,帮助里面都有,你可以和你的评估值和他的值的对比,复杂程度自己做下比较,评估测试一下自己的shader,让你的消耗程度和他写的某种shader差不多,这样的话你的场景中,可以不需要全部自己写shader了,一部分的可以用原生的,一部分用自定义的,就可以解决兼容性的问题。

  第二个来说,非常容易扩展,因为LOD随便定,所以容易扩展。

  第三个的话是切换很方便,切换其实就是用到了Max LOD开始的时候,quaity setting的面板,只要把中间那个max LOD的值改了,就自动切换了,所以综上所述,它很灵活。但是它也有缺点,缺点就是现在变的冗长,修改起来,一下子修改多个LOD,第二块来说,会稍稍多占一点内存。

  这边其实很简单,就是提了一下,也可以用Script方式可以切换,所以含这些的,包括的物体,这类物体的Shader会变成另外一种状态。

  但是有一点注意,因为写shader的时候,经常碰到一个兼容性问题,尤其写一些,和API相关的东西。其实兼容性问题都来自于两点,是D3DLike还是OpenGlLike,

  主要不同点一个是切线是不一样,还有深度方向是相反的。然后数值的精确度,这种全精度、半精度类型等,可能某些Shader对数值精度会很敏感,千万注意这些问题。还要千万不要忽视PC,我一开始写这些东西,经常碰到的问题就是在真机上一切都OK,PC上会报错,因为Unity都是有支持的。那么它的shader在一个PC,并且装了比较高版本directx的,(DX9以上),那这个shader compiler是不一样的,会严苛很多。所以需要花更多的时间去维护。

  最后的话,还有一些小的技巧上的东西,我觉得也挺重要的,第一个是后期滤镜,一定要把后期滤镜的合并起来,因为unity的标准资源包中,包括了一部分。但就算用官方的,也是可以合并在一起,这样可以节省rendertexture的数量,在一帧中不同阶段的重用率,这样带宽占用就少一点。第二尽量使用Unity提供的宏。因为用了shader的LOD及宏控制,一定要放在Shader Variants的容器下,并且挂载到quality setting中,这些shader在一开始就被预加载,虽然内存多那么一点点,但是在游戏中不会卡顿。还有就是要注意透明,还有一个就是在有可能情况下,可以使用一些culling的方式可以自己写一些Cullin给的方法,因为unity都有开放接口,或者使用官方的occlusion culling。

  这个就是Demo本身,这个屏幕很大,大家会看到影子是画两层,如果说放在一个非常高ppi设备上,这两层影子就变成软阴影,这本身是一个PBR材质的Demo,现在是最高级别,大家可以看到会有景深,会有bloom效果,还有PBR所有反射还有影子等等,这是降一档,其他效果都还在,还有影子变成单层,法线贴图没有了。再降一档(我这边有意做的区别很大)反射没有了,变成这样了,然后后面那些塑料球的质感变化不大,影子变成不受你太阳光的角度控制,变成了垂直的,因为这样是最省的。

  然后再往下,高光也没有了,影子也没有了,再往下,只有顶点光和贴图。使用到相对比较实际的情况下,是这样,差距没有前面看到那个Demo那么大,这个是全效果,往下,并且影子那边那辆赛车上只有影子,自投影和地面投影,都有一个影子,再往下动态投影没有影子,并且反射关闭了,但是specular还是在,再往下lightmap还在,其他东西没有了。最后一级,是顶点光照,这些可以写成各种各样不一样的样子,可以做的就是会更好一些,或者说是差距再大一点都是有可能的。

  今天的话,我分享的内容就全部到这里,时间有限,谢谢。内容结束代码 人物, 莉莉丝李靖, 莉莉丝111111111111111111111111111111111111111锐亚教育

锐亚教育,网络游戏,网游,新游,游戏,新闻,国内,全球,评论,资讯,专题,图片,焦点,排行,免费,私服,魔兽,传奇,西游,泡泡堂,冒险岛,征途,劲舞团,劲乐团,公会,外挂,17173,玩家,测试,内测,封测,公测,试玩,调查,flash