orangeqc 发表于 2020-11-24 08:45

Unity大地形分块加载(一)

过年前后那段时间,部门让调研Unity大地形这一块,花了大概几个月的时间吧,前前后后,可惜的是后来项目也不用了,我也转项目了,导致做了几个月的东西“白做了”,一直耿耿于怀,找了个时间整理一下,写点东西,不然真就白做了,什么也没留下。
    手游现在慢慢向重度化发展,像传统端游那种大地形,甚至是像我的世界那样完全无边无际,想必在手游上也会慢慢普及。但是unity,作为现在的3D手游引擎的首选,他本身的地形系统是不支持做这件事情的,那么只能自己造轮子了。由于时间有几个月了,并且这几个月,那一块的代码都扔一边了,我尽可能正确地描述一下,当时做这个东西的思路,可能有些不对的地方。
1, 切割地形
由于美术编辑地形是在Unity内编辑的,也就是说对于程序来说,Input是一个美术编辑好的大地形。切割地形这一步没什么太多说的,可以参考有个插件叫:SliceTerrain,网上有源码,好像是JS的,可以自己转成C#的,就一两个文件,转化很快。这里有几点需要注意,一是那个插件在切出来有时是有接缝的,不知道是不是我的版本问题,我修改了一下,把每块的边缘给接上相邻的地形。再一点就是,由于大地形,美术极大可能是用了超过4张地形纹理,但是切完每一块,如果美术能保证能少于4张,会给我们效率节省很多(实际上美术也很容易保证),所以需要注意调整每张地图的纹理,这个插件也没处理,需要自己修改。
2, 地形转化为Mesh
这个大家都会用T4M,着实是因为Unity本身的地形系统在手机上性能太差。这一步虽说大家都是用的T4M,但是我们这需要注意的就很多了。最主要的原因是我们这用到了切块,虽然上一步我们通过处理,地形之间的接缝没了,但是如果分块使用T4M的话,顶点是没有接缝的,但是法线和切线就存在很严重的断层了,这里我们采用的是使用没开始切割之前的地形数据,取出Normal,然后直接赋值给Mesh,不要使用Unity自动生成的Normal。T4M还有个很大的问题是,它是等比切割的,复杂地方跟平坦地方所占面数是一样的,由于大部分地形是很平坦的,可以优化一下,合并一些面,能节省很多,但是在合并面的时候依然要注意法线,还有就是优化的时候注意边缘接缝,最好是边缘不要优化,或者说是无损优化,即:只有顶点高度是一样的才合并(其实这样就够了,不需要过度优化,毕竟其实少一些面,也优化不了多少性能)
3, 地形LightMap处理
这里有这么几种方案,第一种办法是直接找到渲染好的那张大的地形LightMap,然后设置好Uv2,对应上,就可以了。这办法最简单,但是地形的LightMap没有分块加载。第二种办法是将那张大LightMap按每一块的大小进行切割。这里说一些LightMap切割工具,由于Unity生成好的是Exr格式,而Unity本身是没法用脚本解析的,这里我们用的是OpenExr,这个是个开源的库,代码功能还挺多的,有十几个,编译一下,或者直接找个Dll,这方面中文文档很少,大部分都是英文的。还有一种办法是切好了,分开再渲染一次,这种办法要求很高,需要做到法线,切线边缘要完美连接,即使这样也有时候会出现接缝,这里我没有细究,应该是可以做到的,由于我们的制作流程是美术处理好了,我们再用工具切一次,美术需要来回调东西,渲染看效果,要是采用这种方法很麻烦。这里还有一点需要注意的是,我们不能再使用Unity的LightMap系统了,我们需要将LightMap贴图直接设置到Shader里边。
4, 地形加载
至此,我们对于地形来说该有的数据已经齐全了,使用起来这一步就相对简单了。我们使用的是最简单的九宫格或者十六宫格显示,即:走到哪,动态更新周围的那几块地形。但是问题又来了,由于现在的MMO普遍都支持视角能抬起来,如果视角抬起来,那么稍远的地方就是空的,看起来就很别扭,如果显示过多,又有性能问题,一般这类类似的问题就是采用LOD了,在这,那么就需要用简模代替未显示的一些模型。
5, 简模生成

由于我们切的时候就能指定切的细节数,所以当时就直接切了个宽松一点的一套模型,用雾颜色Shader来渲染,跟细节模型对应上,然而,事情并没有那么简单。简模跟高模在拼接时产生了非常多的接缝。能透过地形,看到底下的天空盒,显得非常刺眼。如下图:




如果A1,A2,A3高度不一样,可以想象,在A2那肯定会有缝。那么又开始填缝算法了,这里传统的地形LOD填缝算法比较多,选种能用的就行,我这里是在生成简模时,知道了高模的顶点数据,那么我就在简模的边缘上下左右四个方向,分别处理,如下图:



针对高模的边缘添加顶点,然后按照图所示,添加面。
至此,地形分块加载完成,其实啊,远远不够,地形分块处理完,需要给模型也要动态加载,动态加载又涉及模型合批,lightmap分离,等等问题。地形上还有一些草,植被,顺便吐槽一下unity那个地形的植被是真的糊弄人,根本不能用。今天先写到这,后续内容得整理一下,因为是几个月前的事情了,并且这一块细节好像还挺多。
页: [1]
查看完整版本: Unity大地形分块加载(一)