平滑的戰爭迷霧效果是如何實現的?

很古老的戰爭迷霧(比如SC1,WAR2里)實現演算法很簡單,把地圖分割成n×n的格子,然後從單位所在的格子向外搜索視野長度的可見區域,在這些區域上不繪製陰影就行。這樣單位的視野範圍是個接近圓的多邊形。單位移動時戰爭迷霧也是呈「量子」態消失的,不自然

但是到了SC2,WAR3里,戰爭迷霧的邊緣是平滑的,單位的視野範圍是一個圓,到這裡也好實現。但是在單位移動的時候,戰爭迷霧的消失是平滑、連續的,不像前面的「量子」態地消失,這是怎麼做到的?應該不是單位每移動一個像素就重新計算渲染一下迷霧吧?感覺這樣效率很低,不知道有沒有特殊的演算法。

網上能找到的是前一種戰爭迷霧,所以有此一問。

謝謝


所以說做遊戲思維要靈活,不要死心眼。

別看WC3、SC2是3D遊戲,本質邏輯和SC一樣,視野還是按格子計算的。單位移動只要不出當前格子,迷霧就不會發生任何變化;移動到下一個格子的時候,迷霧會跟著多打開一格。換言之,迷霧覆蓋也好、消散也好,依然是按整格尺寸變化的,和SC是相同的機制。

那麼為什麼SC里用單位探路時,迷霧是一塊一塊打開的,顯得有些僵硬;WC3和SC2卻是流暢平滑、連續推進的呢?

雖然沒有確切證據,但我有九成把握認為,它們只是加了一個速度適中的漸變動畫效果而已。需要消除/添加陰影時,不去瞬間切換遮罩物透明度,而是觸發一個漸變過程,使玩家產生錯覺。

反正如果是我來開發,我就這麼實現。簡單粗暴。

順手做了個測試,讓單位每次挪一小步停下,截圖,效果如下:

圖1,請注意農民和鐵匠鋪的相對位置。

圖2,農民向右走了一步,但還在同一個格子里,迷霧毫無反應。

圖3,農民繼續向右行走,跨越中線進入下一格,視野隨之「平滑」打開。陰影退散過程約1秒,結束時變成圖中所示情形。

圖4,農民繼續向右行走,但沒有進入再下一格,因此視野保持不變。

*註:造建築物時顯示的網格是64×64單位,而地圖實際的格子是128×128單位,邊長是兩倍。例如鐵匠鋪看起來是4×4格建築,其實是2×2格建築。上面圖中的農民只走了大約兩格長度。

實際遊戲中玩家顯然不會這麼一步一挪地操作,都是大步流星。正常單位的移動速度有200~350,探路時開圖的動畫完全可以連貫起來,讓你感覺彷彿迷霧被平滑驅散一般。如果你用一個移動速度特別慢的單位(例如NE的建築)做測試,就可以明顯看到視野是一坨一坨點亮的。

所以說做遊戲思維要靈活,不要死心眼。障眼法多得是,不管黑貓白貓,能糊弄住玩家就是好貓。

——————————

評論區有位同志問,如果單位走得太快,迷霧漸變還沒結束就走過去了怎麼辦?

有人猜迷霧動畫速度和單位移動速度掛鉤,錯。

有人猜迷霧動畫速度和單位距離掛鉤,想法很好,但遊戲中不是這樣的。

正確答案是:單位會走到迷霧裡,從玩家屏幕上消失,哪怕是自己的單位。暴雪壓根就沒想對這種極端情況特殊處理,使單位保持可見,反正正常遊戲中的單位視野基本都是600以上,移動速度上限是522,一般足夠了。它才懶得管你用地圖編輯器弄個跑得賊快的瞎子怎麼辦。


之前博客上總結過:遊戲中的戰爭迷霧 - 逍遙劍客 - 博客頻道 - CSDN.NET

基本原理很簡單,把上一次的迷霧格子信息寫入紋理的R通道,把當前的迷霧格子信息寫入紋理的G通道,Shader里根據時間做個插值就行了。我們之前迷霧0.5秒才更新一次,中間就是插值出來的

float2 fowUV = worldPos.xz / g_FogOfWarInfo.xy;
float2 fogOfWar = tex2D(s_FogOfWar, fowUV).rg;
float fowMask = lerp(fogOfWar.r, fogOfWar.g, g_FogOfWarInfo.z);


不能確定我說的是不是war3中的那種,但一個朋友做過一個迷霧的demo,是用光源多的,並且光源消失後地圖變回黑色。

這個demo中,地圖其實就是一張圖,光源與黑暗層進行運算,渲染出那種開霧的效果,但邏輯層面的東西可能需要再想下。他用的是flash實現的 AGAL,效率蠻高的~


那麼,極坐標的《家園》呢。

還有經緯球坐標的《橫掃千星》呢


迷霧和單位可見性相關.那麼並不需要沒個像素都算.一個單位也不可能顯示一部分.只可能完整的顯示或不顯示.所以有多少單位就算多少次就行了. 似乎沒你想像的計算量大啊.


有可能處理辦法和曾經一樣,只不過硬體上去了,原來n x n 的格子變成了n方xn方個~


推薦閱讀:

為什麼說平均情況下,插入排序比選擇排序快?
PageRank 演算法的複雜程度怎麼樣?
越來越多的群體智能演算法(蛙跳演算法、貓群演算法、蟑螂演算法等等)有存在的必要嗎?
搞信息安全需要什麼基礎。?
「AVL 旋轉」存在的目的是什麼?儘管有 logN 的時間複雜度,樹的 hierarchy 豈不全亂了?

TAG:遊戲開發 | 演算法 | 魔獸爭霸3Warcraft3 | 星際爭霸2 |