山川地貌,平原海洋,都是游戏场景中非常常见的,几乎每个游戏制作过程中,都会涉及到相关的部分。其中城市区域,由于表现需求比较规则规律,泾渭分明,所以直接按照普通建筑模型的制作方式来制作就可以满足要求,但野外的地表制作,就会涉及多层地表混合需求。
当遇到这种需求时,一些小型场景的制作方式,大多是前期使用Terrain制作,后期转成模型加自定义shader的方式来制作。
我们在大世界的地形制作中,也尝试了多种方式,最后决定采用Terrain+模型LOD的方式来制作大世界的地形地貌。
首先,在地形的制作初期,只需要正常的使用地形制作即可,我们是使用1000X1000一块的尺寸来制作的,如果美术同学需要地形上的格子大小,每一块是1X1,或者2X2时,就需要Terrain的尺寸和高度图分辨率对应上才可以了。如下图
Terrain的宽度和长度,决定了每一块地形的实际尺寸,而Heightmap Resolution的数值,是每一块地形的长宽边上,顶点的数量,1024段1米长的线段,有1025个顶点。
因为Heightmap Resulution的数值,是unity提供好的几个参数选择,所以,如果想要每个格子的大小是1米,就需要设置Terrain的长宽来适配它了。
有一点需要注意,HeightmapResulution设置的数值变高,每一块地形的面数就会大量增加,如果对terrain本身精度要求不那么高的情况下,可以适当的调低这个数值。但这个数值在从高向低调时,一般不会有什么问题,unity会自动做好差值,但如果调到低后,再想调回高的数值,就会丢失很多细节,有时还会出现一些锯齿状的错误。因为地形的细节是保存在TerrainData里的,一旦修改保存,并且关闭场景后,就很难再恢复回来,请大家在使用时一定要留意。
下面三张图,分别是Heightmap Resolution 1025x1025,从1025降到513x513,从513又升回1025的三张截图,可以看到虽然第三章的网格密度又恢复到1025了,但是地形细节还是和513时一致。
大世界中,整个世界的地形是比较大的,由多个地形块组成,建议在创建时,使用unity地形的Neighbor Terrain来创建,通过Neighbor Terrain创建的地形,可以无接缝的方式修改,就算多位地编同学分开修改后,整合在一个场景后,接缝的修复也更容易。
大世界的地形地貌制作,随着移动端渲染能力的逐渐增强,也已经越来越细致,地形其实也主要是表现比较平缓的地面,野外道路,水下河床等方面。山体和变化较大较复杂的位置,其实地形也只是作为基础,上面还是要使用更精细的山石和其他模型来遮挡覆盖的。
我们每一块的地形,使用了7-8套地形贴图,使用了两张Splatmap来控制混合这些地形贴图,我们还制作了TerrainData的写入工具,方便美术同学在PS中修改Splatmap后,再写入到TerrainData中替换原本的。
前面说了,我们初始地形每一块的大小是1000X1000,这样的大小,是为了在分块编辑时,大小适中,比较适合分配给多个地编同学单独编辑,不会太碎,也不会每块太大。但我们给地形做了LOD,如果地形块太大,LOD的作用就被降低了。
之后,我们又做了地形的切分工具,在地编同学编辑基本完成后,会使用工具对地形进行切分,可以根据项目需求切分大小,我们目前切分的大小是500x500每块。
这样同屏中大多数时间下,LOD切换距离不是很大的情况下,只有玩家所在脚下是地形,其他就都是模型的LOD了,除非是刚好站到两块地形或者四块地形的边界处,才会加载比较多的地形。
下面说说地形的LOD,为什么非要做地形的LOD呢?地形的消耗,主要在哪里呢,地形的消耗,主要应该分为3个部分,贴图,面数,批次。
地形表现时,为了地表的多样化,又同时要保持贴图的细节精度,所以基本都会使用多套贴图来混合表现,如果场景比较小,能控制在4套以内,可能还好,但是随着现在大场景和高质量的需求,一块地形七八套贴图的,已经很常见了,每套贴图中,如果把粗糙度图合并到albedo或者法线中,则也需要两张,八套就需要16张了,如果每块地形地表差异较大,那么多块地形的贴图数量就比较高了。
地形的面数前面也提到过,在高度图分辨率设置较高的情况下,面数也是很可观的。批次在不开启Draw Instanced的情况下,一块比较复杂的1000x1000地图,就可以产生十几个或者更多批次。开启了Draw Instanced的情况下会减少很多,但也依然还是有3-5个批次不等。
而如果用模型LOD来替代远处的地形,每一块地形的批次只需要一个,而贴图只需要把地形混合后的贴图,烘焙成一套的,甚至只需要一张Albedo,因为距离远,法线图有没有的区别也不是太大,面数更是可以比较自由的控制。
地形的LOD制作也比较简单,可以使用Terrain To Mesh之类的第三方插件,直接把地形转换成Mesh,还可以直接生成多层贴图混合后的单张BaseMap。
但有一点需要注意,就是如果想要直接生成减面后的模型,就需要留意,减面时地形最外圈的边缘点,不能减少,否则和Terrain衔接处,会出现接缝。
Terran To Mesh也有减面的功能,但只能均匀减少,不能根据曲率来优先减比较平缓的区域,也不能锁定边缘顶点。所以减面就还再需要一个工具,例如第三方的Polygon Cruncher,可以比较方便的,批量的进行减面,如果需要非常精细的减面,可能还是要美术同学的帮助了。
至于LOD的精度,和LOD Group类似,也支持多层,每层可以根据需要加载精度由高到低的LOD模型。
提个算是额外的话题,为了解决岩石和地表的衔接生硬问题,我们做了地表融合,需要在渲染管线的开始阶段,预渲染一遍地形,所以地形的优化,效果还是比较大的。
接着说地形的LOD,还有进一步的优化方式,就是把一些不止是地形的东西,也做进来,例如,一些比较大的山体模型,比较明显的建筑,在足够远时,可以直接和地形合并在一起,当做低阶的LOD,因为足够远,山体和建筑的贴图可以用顶点色,或者UV缩到足够小,合并到地形LOD的那张图里,可以节省很多的远景批次,因为足够远,质量也不会收到太大影响,缺点就是需要一定的美术工作量。
优化方面做的东西,差不多就这么多了,其实做的不多,也还有些问题没有解决,后续还会持续的迭代修改。
欢迎加入我们!
感兴趣的同学可以投递简历至:CYouEngine@cyou-inc.com