【博物納新】是uwa旨在為開發者推薦新穎、易用、有趣的開源專案,幫助大家在專案研發之餘發現世界上的熱門專案、前沿技術或者令人驚嘆的視覺效果,並探索將其應用到自己專案的可行性。很多時候,我們並不知道自己想要什麼,直到某一天我們遇到了它。
戰爭迷霧在實際軍事戰爭中通常是指:由於對敵人情報不清楚,而無法確認除友軍所在地以外的大部分地區的敵人分布及活動情況。在遊戲領域,戰爭迷霧也常被用來模擬真實軍事戰爭中的情況。尤其是即時戰略以及moba類遊戲中,它是增加遊戲戰略多樣化以及趣味性的重要元素。
戰爭迷霧最早被用於遊戲,是在一款即時戰略遊戲《沙丘2》中。每當玩家開始新的一局對戰時,玩家只能觀察到自己基地及單位周圍極小的範圍,而絕大多數地圖區域均被黑色遮蓋。當玩家命令己方部隊向黑暗區移動後,經過區域的迷霧會自動消散,地圖變得可見,包括該區域的地形、敵人活動情況等等。這一經典模式也被絕大多數後來的即時策略遊戲和moba遊戲繼承。
本文接下來將要介紹的是基於unity引擎的一種戰爭迷霧實現方法。該方法的主要思路是:首先,將場景在xz平面分成均勻的方格。並用乙個二維陣列記錄每塊方格區域的可見性。然後,根據己方單位的位置、以及可見範圍,計算場景中可見的方格,並記錄下來。接著,利用該可見性資料,生成一張記錄了可見性區域的紋理,並對該紋理進行模糊等操作。最後,將該紋理通過影象後處理繪製到螢幕上。下圖顯示了該項目的執行時截圖:
如上圖所示,其中左上方紅色方框顯示的場景渲染的結果。場景中綠色膠囊體表示己方單位,紅色膠囊體表示地方單位。黑色不可見區域為迷霧籠罩區域,可見區域為迷霧消失區域。當迷霧消失時,場景中的物體以及地方單位都變為可見。右下方綠色方框顯示的是戰爭迷霧資料視覺化結果。其中,黑色部分表示沒有被己方單位探索過的區域,紅色區域表示已經被己方單位探索過的區域,灰色區域表示當前己方單位所在周圍可見的區域,綠色區域表示當前更新可見資料時新增的可見區域。
上圖中的四個灰色區域表示了四個己方單位在朝著不同方向探索地圖,下圖動態地展示該效果:
3.1 使用方式
該專案使用非常簡單,主要涉及到的指令碼元件有三個:
fogofwareffect:該指令碼元件需要掛載在主相機上。引數設定如下圖所示:
其中,fogmasktype是用於設定計算可見區域範圍的方式,可選項有:basic、accurate、以及circlar。剩下的引數包括:設定方格區域大小,紋理解析度、模糊效果的引數以及shader。具體含義可參考工程**,本文不再贅述。
fogofwarexplorer:該指令碼元件需要掛載在己方單位上。引數設定如下圖所示:
其引數比較簡單,僅包含乙個可見區域範圍半徑。
fogofwarstalker:該指令碼元件需要掛載在敵方單位上。其主要作用是根據戰爭迷霧的可見性,計算並設定該物件的可見性。
3.2 具體實現
當fogofwarexplorer元件掛載到己方單位上後,在每一幀的update函式中呼叫fogofwareffect.updatefowfielddata函式來更新當前的可見性資料:
計算當前可見性資料時,採用了多執行緒的方式,利用threadpool.queueuserworkitem函式進行非同步計算:
計算結束後立刻對儲存可見性資料的mask紋理進行更新:
(詳細**可參考:fogofwarexplorer.cs,fowmap.cs等)
在渲染迷霧時,將儲存可見性資料的mask紋理傳入shader。然後,根據相機視域體的位置計算螢幕上每個畫素在mask紋理上的紋理取樣座標,並進行取樣。最後,將結果疊加到場景中。
(詳細**可參考fowrenderer.cs)
最後,uwa慣例是一定要關注效能資料的,在oppo a59s、三星s6、小公尺8三個不同機型上使用uwa got online分別進行了一分鐘左右的測試,得到三颱裝置上的幀率資料如下圖:
當然這個例子中,還有相當一部分渲染耗時是和戰爭迷霧效果無關的。所以接下來以三星s6的資料為例,具體檢視報告中的**效率耗時情況。
首先關注的是渲染耗時camera.render這一項,除了不透明渲染地形與主角的耗時之外,發現camer.imageeffects這一項的耗時也比較明顯,佔了總體耗時的42%。聯絡上文此專案的實現方式可知這一項對應的是迷霧紋理通過影象後處理繪製到螢幕上的操作。
如上圖所示,camera.imageeffects的耗時大約在4~7ms的範圍內波動,部分高值與camera.render的整體高值重合。
從以上統計中,可以大致得出戰爭迷霧相關的邏輯在不同機型上的耗時表現。這裡注意到後處理用到了onrenderimage,且耗時較高,建議在實際使用時,參考unity引擎後處理效能優化方案解析一文進行優化。
今天的推薦就到這兒啦,或者它可直接使用,或者它需要您的潤色,或者它啟發了您的思路......
SpeedTree Shader開源庫測評
博物納新 是uwa旨在為開發者推薦新穎 易用 有趣的開源專案,幫助大家在專案研發之餘發現世界上的熱門專案 前沿技術或者令人驚嘆的視覺效果,並探索將其應用到自己專案的可行性。很多時候,我們並不知道自己想要什麼,直到某一天我們遇到了它。可用於構建樹木的工具,不僅能營造出真實的樹木和森林效果,還可以方便地...
Egret手機遊戲戰爭迷霧
一 建立戰爭迷霧類 module gtm private bitmap egret.bitmap private bgsh egret.shape private foglayer egret.displayobjectcontainer public init w number,h number ...
基於紋理繪製的戰爭迷霧
戰鬥迷霧 fog of war 是rts類 moba類遊戲中不可缺少的乙個部分。在2d遊戲中,使用磚塊地圖 tiled map 拼接,是最常用的實現方法。但在具體實現過程中發現,磚塊地圖實現的戰爭迷霧有一些不足,比如迷霧邊緣不柔和 解開迷霧時不流暢 繪製定點數過多,在低端手機上的幀數降低明顯等。這裡...