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是在第一次顯示時計算出來的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章