赞
踩
2、实现方案
3、技术原理
(1)Terrain转Mesh
(2)减面生成多层LOD
Terrain转Mesh介绍
Unity传统的Terrain面数是非常恐怖的存在,且会产生大量的Draw Call和Terrain Data,内存大加载耗时等,它们都会导致性能的极大消耗,不适合在实际项目中使用,因此Terrain转Mesh诞生。
本篇文章介绍的方案与传统的转mesh有所不同,这次转mesh是针对无缝大世界所准备,一下将会介绍方案和技术实现原理。
实现方案
在真实大世界中,由于地图通常都是好几k以上,这么大一块地图用一两块完整的地形拼接往往不现实,因此需要分开多块,而考虑到性能问题,在离视线比较远的地形块精度是不需要太高,这样就出现了每块地形都有几层的LOD,由于远一点显示的LOD精度不一样,这样会导致两块不同LOD级别的地形边界上的顶点不一致导致穿透问题。
本篇文章介绍解决法:只要保证每块LOD级别的边顶点数目一样,这样就能达到无缝连接。
实现过程:
技术原理
Terrain转Mesh
如下图,在转之前,首先将地形的顶点分开成5个部分处理,其中4个部分分别是4条边,因为转了mesh之后,在生成多层lod的时候边顶点是不能变才能达到无缝连接,为了避免后面lod层级边数量太多,所以做一下合理的智能减点。
1.第1~4部分
存储结构:顺序列表有序将顶点存入
技术细节:根据自己设置的边顶点数量,平均划分好顶点并排列存入结构,这种均匀减点最后效果如图所示。
然后再经过智能减点算法再次减少顶点个数,原理根据设置两条相邻边夹角大小判断是否减点,原理非常简单。
这种智能减点后效果如下图所示。
2.第5部分
存储结构:两个顺序结构组成的动态二维数组,行和列也根据图中顺序存入
3.三角形构建
顺时针绘制三角形,法线方向遵从左手法则(Unity的规则)。
第5部分构建:由于行和列的顶点一一对应,因此三角形的构建非常简单,相邻4个顶点构建2个三角形依次完成。
第1、3部分构建:自身边与第5部分最靠近的边进行构造三角形,算法自动适配构造。
第2、4部分构建:自身边与第5部分最靠近的边进行构造三角形,其中四个角落四个顶点在1、3的列表里,因此算法做一点更改就可以了。
4.UV设置
每个点的UV存储顺序必须与顶点存储顺序一致。
自身0~1UV设置:因为地形是由数个相等的正方形组成的一个大正方形或大长方形,因此UV可以根据顶点在当前矩阵上的位置除以矩阵的大小得到。
由于最后一层级一般离玩家视野较远,因此该级别的地形贴图可以不需要那么复杂,直接用一张缩略图就行啦,缩略图是整个大地形唯一一张共用的图。
大地形0~1UV设置:大地形共用一个材质球一张大贴图时,例如下图中地形为:2*2,那么UV设置将在自身UV基础上除2加上UV偏移值。
图2-3 UV相对设置
以上构建思想均是我所给出的5个结构存储顶点相关数据的构造方式,可以参考。
减面生成多层LOD
方案:
1、在已有减面工具基础做
2、自己实现减面工具。
首先是使用已有减面工具,这种要找到能够保证边顶点不被任何修改的减面工具才可以,自己外层包装一下就好了,这种做法剪出来效果如下图所示。
从下图可以看到不同lod的无缝连接,这就是保证边不被减少的效果。
自己实现减面
用减面插件没什么好讲的,这就讲一下如何自己减面,看我另外一篇文章:https://blog.csdn.net/qq_33700123/article/details/113894702,只要实现了自己减面差不多也相当于实现了一个减面插件,然后包装一下就ok啦。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。