3D瓦片地圖採坑錄

歡迎參與討論,轉載請註明出處。

前言

由於Demo的場景風格主打像素風格(這裏的像素風格指具備一定精度的風格,而非時下流行的馬賽克),故決定使用瓦片(Tile)地圖來實現。也就是這種東西:
在這裏插入圖片描述
  遊戲地圖將由一個個規範化的單位圖片拼接而成,是爲瓦片。在早期的像素風格遊戲可謂相當流行,因其構造成本低(無論從技術上還是美術上),而卻能靈活拼接出各種各樣的地圖。於是我們也打算如此,但是在3D遊戲下搞瓦片地圖確是罕見得很。於是便開始了採坑之旅,遂成本文。

Sprytile

首先我們想到了在3D遊戲下最接近瓦片地圖思想的方案:Terrain,一般3D大地圖都用類似方案:對一張平面地圖進行各種揉捏形成地形,並在此之上塗抹各種圖素。但可惜對於瓦片地圖而言未免殺雞用牛刀了,且在各方面都不能做到最適化,遂不考慮。
  其次便是Unity官方自帶的2D Tilemap Editor,對瓦片方面的需求倒是滿足了,可惜3D瓦片並不只是在一張平面上進行,而通過多張平面旋轉組成場景未免勉強,遂放棄。
  既然在Unity這邊行不通,那麼便考慮生產端的Blender有什麼合適的插件了。果不其然找到了Sprytile,一看就明白,就是它了:
在這裏插入圖片描述
  使用準備好的tile圖集,劃分格子,在Blender以格子爲單位進行填塗,每個格子將會是一個面,支持XYZ三個平面進行,在填塗完成後可作爲正常模型進行各種操作。一切看起來是那麼的美好,然後一路到了遊戲後……

過濾之殤

前篇的截圖便可看出問題所在:
在這裏插入圖片描述
  可以看到地板之間存在奇怪的黑線:
在這裏插入圖片描述
  根據插件文檔提供的Unity導出說明來看,必須要將地圖貼圖的過濾模式設置爲Point,即鄰近過濾:
在這裏插入圖片描述
  嗯,黑線果然消失了。那麼問題便出在圖片的過濾模式了,回去複習了下紋理過濾,答案昭然若揭:
在這裏插入圖片描述
  由於瓦片地圖的習慣會將相關圖素集成一塊,形成連續的圖塊:
在這裏插入圖片描述
  那麼在線性過濾下,圖塊的邊緣像素在採樣的時候將會混進相鄰圖塊的顏色,於是那些奇怪的黑線便是這麼來的。
  也許讀者會認爲:不用線性過濾不就得了,畢竟插件作者也是這麼認爲的。可惜我們做的風格並不適合用鄰近過濾,那將顯得與人物畫風差異過大且馬賽克:
在這裏插入圖片描述
  細心觀察上圖底部,這是開啓抗鋸齒(MSAA)導致的。查閱資料後發現這是MSAA的特點導致,如此哪怕我們想靠鄰近過濾解決也是沒門……當然也考慮過更換爲其他抗鋸齒的方式,但是效果都不甚喜人,於是開始尋覓解決之道。

無奈的解法

首先考慮對tile圖片進行下手:既然邊緣會採樣到相鄰圖塊的像素,那麼將它們隔開不就得了,如此:
在這裏插入圖片描述
  當然這麼做的話要讓Sprytile有所支持纔行,好在它是開源的。Blender的插件改起來也還算容易,畢竟會在界面提示標識好功能函數名。結果還是翻車了:
在這裏插入圖片描述
  瓦片之間出現了奇怪的透明點,仔細一想便明白了:透明像素一樣會被採樣到,所以會影響到透明度。於是迅速想到下個方案:讓每個圖塊外擴邊緣1像素,這樣邊緣的採樣只會採樣到相同顏色的像素:
在這裏插入圖片描述
  很不錯,黑線什麼的都消失了,哪怕是開着MSAA。同時美術也在Blender琢磨出了一種方法:在不做任何處理的貼圖的基礎上,將瓦片地圖模型的UV全部縮小一點(參考值:0.96),如此便不會直接採樣到邊緣像素,從而以犧牲了一點點邊緣效果解決了問題。
  兩者的效果最終是差不多的,但都是不完美的,在編輯器裏便一目瞭然:
在這裏插入圖片描述
  可以看得出,格子之間的邊界可謂涇渭分明,這是因爲每個格子都是獨立的mesh,它們並不是作爲一個整體去渲染,也就不存在視爲一個整體去採樣。也就無法達到真正意義上2D遊戲裏要達到的效果(格子之間徹底融爲一體)。要這麼做有兩種方式:第一種是根據瓦片地圖的填塗情況最終生成大貼圖與新模型,但這種方式相當不優化,並且會急劇增大包體。其次是仿照以前的2D遊戲做法:遊戲本身使用鄰近過濾渲染,最後將渲染成圖進行拉伸放大(放大方式採用線性過濾),但這是犧牲畫面分辨率帶來的。
  經過以上總結可以看出,基本不存在非常完美的解決方案,只能矮子裏拔大個了:UV縮小的方案從工序上最爲簡單,且顯示效果也能接受(沒對比過原版基本看不出太多異樣)。

後記

一開始我們覺得這種瓦片地圖1個格子就佔2個三角形,面數會不會太高了。結果在參考其他遊戲的情況時發現《閃之軌跡3》的一組垃圾桶的面數……
在這裏插入圖片描述
  嗯,一組垃圾桶的面數都完爆我整個瓦片地圖模型了,法老控牛逼!
  順帶一提的是,剛纔提到的格子邊界問題在Unity官方的2D Tilemap Editor也是存在的,只能說是瓦片地圖的侷限性了,好在離得遠也看不太出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章