Unity原生地形系统分析

  一直听别人说Unity的地形系统在做大型地图时效率较低,不适合在手机游戏上使用。最近正好在调研手游的地形系统,顺便把Unity地形系统的特点总结下。本文观点基于Unity4.x版本代码分析得到,部分内容可能过时。

  1. 大体上讲,Terrain将地形转换为一个Tree来管理,RootNode就是该地形总共的大小。每个Node由4个等大的孩子Node组成。每个Node,不论处在哪一层,其顶点数都是17*17。整个Tree的层数根据HeightMap的点数计算。
      举个例子:对于一块512*512米的地形,采用两米一点的方式,其heightMap的大小就是257*257像素。那么由于每个Node大小为17*17像素,所以最小层级的Node(叶子)大小为32*32米,上一层大小为其4倍的64*64米,以此类推,带上根节点一共有5层。
     
  2. Unity的LOD算法相比效率更优先显示的效果,比较复杂。
      Terrain的LOD以Node为单位,若当前Node满足LOD要求,就显示。若需要显示的更精细,则继续判断其子Node。
      部分手机游戏使用的地形系统是直接按照地形划分的小块与相机之间的距离判断,离得近的该块内每个顶点都显示,随着距离变远,每隔2的n次方显示一个顶点,n不断变大。
      而Unity的地形系统在加载时,对于每个Node,会求出HeightMap上在该Node范围内的每个点的高度(HeightMap粒度的坐标)与该点坐标对应的在Node上的高度的差的绝对值最大值HeightError(因为除了叶子Node,Node的点密度比HeightMap的点密度要稀疏,因此任意坐标在Node上对应的高度是由其四周的点插值得到的,与该坐标在HeightMap上的高度往往不同)。表示若显示该Node,则会造成多大的高度误差。也就是说叶子Node因为每个点都与HeightMap一一对应,因此HeightError为0。
      当判断每个Node的LOD时,根据该Node的HeightError与距离相机的距离,以及相机的焦距、视距和屏幕的像素高度,算出该HeightError换算到屏幕上的像素数量,也就表示如果显示该Node会造成的实际像素误差。将该误差与Terrain参数PixelError比较,若小于该值,就显示当前Node,否则继续判断其子Node。
      这种算法虽然效果更好,但同时消耗也会更高,LOD与高度图内数据相关使得无法通过LOD准确控制屏幕内地形的三角形数量,效率上更加不可控。
      
  3. Terrain的Normal是在第一次显示时计算出来的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值