遊戲裡的火焰是怎麼燒的
粒子火焰最關鍵的技術之一是「疊加混合」。火焰粒子通常不是用普通的透明混合,而是用加法混合,讓粒子之間互相疊亮。這會讓火焰中心過曝發白,邊緣則自然衰減,視覺上非常接近真實火焰的高亮度感。代價是效能:粒子一多,畫面同一區域被反覆繪製的次數就多,這就是所謂的「過度繪製」,也是火焰最常見的效能瓶頸。
為了讓火更完整,粒子系統通常會分層。主火焰負責明亮的火舌,第二層是上升的煙霧,第三層是隨機飄散的火星與餘燼。有些遊戲還會加上一層「熱扭曲」效果,讓火焰上方的畫面輕微扭動,模擬熱空氣折射。這三到四層疊起來,一團看起來很真實的火焰就完成了——而它的本質,其實是幾百個小方塊在按照公式飛來飛去。
3. 流體模擬與體積渲染:真火燒起來的樣子
最頂端的一條路線,是直接模擬火焰的物理行為。做法通常是在一個三維網格上求解流體方程,讓空氣流動、熱量上升、燃料消耗,然後把結果用體積渲染的方式「光線步進」畫出來。這種火焰有真正的內部結構,會翻滾、會產生渦流、會被風吹歪,而且從任何角度看都合理。
問題是它非常貴。三維流體解算對 CPU 或 GPU 的負擔極大,體積渲染又需要對每個像素做多次取樣,兩者疊加起來,一團火就可能吃掉大量運算資源。所以絕大多數遊戲只在特定場合使用:開場動畫、過場演出、單一主角技能特效,或者乾脆預先算好、存成序列動畫再播放。
近年比較折衷的做法,是在螢幕空間做二維流體模擬:只計算畫面上看得到的部分,讓火焰在視覺上翻滾扭曲,但背後並沒有完整的三維物理。玩家看到的「火焰在流動」,其實是螢幕上的影像在流動。這是一條在真實感與效能之間取得平衡的常見路線。
二、火焰為什麼「會燒」:引擎裡的傳播規則
畫面解決的是「看起來像火」,但玩家真正在意的往往是另一件事:這團火會不會燒到別的東西?能不能用來對付敵人?會不會反過來燒到自己?這就進入了遊戲火焰的第二層——規則系統。這裡的火焰不再是像素,而是一組狀態與數值。
燃燒三要素在程式碼裡的對應
現實中的燃燒需要可燃物、助燃物與燃點。遊戲裡通常不會這麼講究,但會用很接近的方式簡化。可燃物對應的是「材質可燃度」:木頭、布料、油、乾草可燃,石頭、金屬、水不可燃。助燃物對應的是「環境條件」:有沒有氧氣、有沒有風、是不是下雨。燃點則對應「需要多少累積熱量才會被點燃」。
於是引擎裡就出現了一組很典型的資料:每個可互動物件身上掛著材質標籤,材質表裡寫著它的可燃度、燃燒持續時間、燃燒時的傷害值、以及燃燒後是否會變成另一種物件(例如木箱燒成焦炭、草叢燒成灰燼)。當一個火焰來源靠近時,系統會查表,決定這個物件是「立刻燒起來」、「慢慢被烤熱」還是「完全不受影響」。
這套設計的好處是「可調可控」。設計師不需要真的模擬化學反應,只要在表格裡填數字,就能讓火焰的行為符合直覺。玩家也因為這套規則而建立起預期:看到木頭就知道能燒、看到水就知道燒不起來、看到油就知道會很猛。這種「直覺一致」比物理精確重要得多。
網格傳播與元胞自動機
當火焰要「蔓延」時,很多遊戲會採用一種叫「元胞自動機」的做法。簡單說,就是把場景切成看不見的格子,每個格子記住自己的狀態:還沒燒、正在燒、燒完了。每一帧,系統檢查每個正在燒的格子,看它的鄰居有沒有可燃物,有的話就用一個機率決定要不要點燃它。
這套邏輯非常適合大面積的火場:森林、草原、村莊、倉庫。設計師只要調整傳播機率、傳播範圍、以及風向的影響,就能做出「火勢一發不可收拾」或「火燒到一半自己熄掉」的效果。你在遊戲裡看到的火沿著草地一路蔓延、繞過石牆、被河流擋住,背後往往就是這套格子在運作。
元胞自動機的優點是簡單、穩定、效能可控,缺點是它本質上是「格子」而不是「連續的物理」。所以有時候你會看到火焰的邊緣呈現奇怪的方形或直角,或者傳播速度看起來不太自然。高階的實作會用更細的格子、加入風場與濕度變數,甚至混合流體模擬來補足視覺,讓它不那麼像棋盤。
材質表與可燃度數值
對玩家來說,最實用的一點是:火焰的傳播規則是有規律的,而規律通常寫在材質表裡。這意味著你可以透過觀察與實驗,反推出這款遊戲的「燃燒邏輯」。
許多遊戲還會讓火焰「升級」:普通的火燒一段時間後變成大火、開始產生濃煙、甚至引爆附近的易燃物。這些階段通常對應不同的傷害與視覺表現。掌握這些階段,你就能判斷什麼時候該衝過去、什麼時候該繞路。
三、火焰如何改變玩法:設計師手上的那把火
技術與規則只是基礎,真正讓火焰變成「遊戲語言」的,是它在玩法上的角色。同一個火焰系統,可以當傷害來源、可以當照明工具、可以當解謎鑰匙,也可以當敘事道具。這也是為什麼有些遊戲的火焰讓人印象深刻,有些卻只是背景動畫。
傷害、照明與視野
最直觀的用途是傷害。火焰通常會造成持續傷害,也就是玩家熟悉的「燃燒狀態」:站在火裡會持續掉血,離開後還會燒一小段時間。這種設計會強迫玩家做出即時決策——是先滅火,還是先處理敵人?是要繞開火場,還是冒著掉血衝過去?
火焰同時也是光源。在黑暗場景裡,一團火就是一片可見範圍,而光源本身又會暴露你的位置。這就形成了一個很經典的張力:你需要火來看清環境,但火也會讓敵人看見你。有些遊戲甚至會讓火焰產生的煙霧遮蔽視線,玩家可以利用煙霧當掩護,或者反過來被煙霧嗆到。
更高階的設計,是把火焰與視野系統結合。例如火光照亮的區域才會顯示隱藏的敵人,或者火焰會燒掉遮蔽視線的藤蔓與布幕,讓原本看不見的路徑顯露出來。這時候火焰就不只是傷害,而是「資訊」。
元素反應與連鎖燃燒
近代遊戲很流行元素系統,而火焰幾乎永遠是核心之一。火遇上油會猛烈燃燒、火遇上水會產生蒸氣、火遇上風會擴散、火遇上冰會融化或蒸發、火遇上毒會爆炸。這些組合讓火焰從一個單純的狀態,變成一個可以主動創造的「反應鏈」。
連鎖燃燒則是另一種樂趣來源。設計良好的關卡會讓玩家發現:點燃一盞燈,火沿著油跡燒過去,引爆桶子,炸開牆壁,最後幹掉一群敵人。這種「一環扣一環」的設計,會讓玩家產生強烈的創造感與掌控感,也會讓火焰從「危險」變成「工具」。
要注意的是,連鎖燃燒同時也是雙面刃。如果玩家不小心點錯地方,火勢可能反過來吞噬自己,或者燒掉本該保留的物件(例如任務道具、可以搜刮的箱子)。很多遊戲會在這種地方給予提示,例如火焰靠近重要物件時閃爍警告,或者讓重要物件不可燃。
火焰作為解謎與敘事工具
火焰在解謎裡的應用非常多樣:燒斷繩子讓吊橋落下、燒掉藤蔓開出新路、點燃火盆啟動機關、用火把照亮壁畫、燒掉紙張讓隱藏文字浮現、用火驅趕野獸或蟲群。這些設計的共同點是:火焰不只是造成傷害,而是改變環境狀態。
在敘事層面,火焰更是好用。它可以象徵毀滅、淨化、重生、怒火、記憶。玩家燒掉一封信、燒掉一座村莊、點燃最後的營火,這些行為往往比對話更有力量。有些遊戲甚至會讓火焰留下永久痕跡:燒過的森林變成焦土、燒過的房子只剩下框架,讓玩家在事後回頭看時,感受到自己行為的重量。
四、為什麼火這麼「貴」:效能成本與優化
火焰是遊戲裡最耗效能的視覺效果之一。原因不難理解:它通常面積大、半透明、會發光、還會同時出現很多層。這些特性剛好都踩在顯示卡的痛點上。
GPU 粒子與批次渲染
粒子系統的效能關鍵在於「批次」。如果每個粒子都單獨送出一次繪製指令,數量一多就會拖垮效能;所以現代引擎會盡量把大量粒子合併成少數幾次繪製,並且把粒子紋理打包成一張圖集,減少切換材質的次數。GPU 粒子更進一步,把粒子的運動計算搬到顯示卡上,讓成千上萬個粒子可以平行更新。
另一個問題是「過度繪製」。火焰粒子層層疊疊,同一個像素可能被畫了十幾次,每次都要讀取紋理、混合顏色。畫面越大、火焰越濃,這個成本就越高。所以很多遊戲會限制火焰的螢幕覆蓋面積,或者在火焰太濃時降低粒子數量。
LOD 與火焰分級
為了在效能與畫面之間取得平衡,遊戲通常會替火焰做「分級」。距離很遠的火焰,可能只是一張會動的貼圖;中距離用少量粒子;近距離才開啟高密度粒子、熱扭曲、體積光等高成本效果。當玩家移動時,系統會動態切換這些等級,讓你看不出明顯落差。
此外,火焰也常被納入整體的效能調節機制。當場景負載過高時,引擎可能優先降低火焰的粒子數或更新頻率,因為火焰通常是「視覺上可以稍微犧牲」的效果。這也解釋了為什麼有些遊戲在戰鬥激烈時,火焰會突然變得比較「簡化」——不是你的錯覺,是引擎在自救。
五、實戰向:玩家怎麼讀懂遊戲裡的火
前面講的都是原理,最後我們回到玩家最關心的事:怎麼把這些知識用在實際遊戲裡。以下幾個觀察與技巧,適用於大多數有火焰系統的遊戲。
從火焰行為反推引擎
你可以用幾個簡單的測試,快速判斷一款遊戲的火焰「有多深」:
把這幾點測完,你大概就能知道這款遊戲的火焰是「純視覺」、「規則型」還是「模擬型」,也就能決定要不要把它當成戰術資源。
利用燃燒機制的實用技巧
以下是幾個常見且實用的思路,可以套用到多數遊戲:
還有一個進階思路:把火焰當成「環境改造工具」。很多關卡的設計是靜態的,但火焰可以動態改變地形——燒掉掩體、燒開通路、燒掉陷阱的引線、燒掉敵人的補給。當你開始用火焰改變環境,而不是只用它打傷害,你就真正讀懂了這套系統。
六、結語
遊戲裡的火焰,看起來只是一團會動的光,但它其實是三個層次的疊合:最底層是渲染技術,決定它像不像火;中間層是規則系統,決定它會不會燒、怎麼燒;最上層是玩法設計,決定它在遊戲裡扮演什麼角色。這三層互相牽制——技術限制了規則的複雜度,規則又反過來影響設計師能做出什麼樣的玩法。
所以下次你在遊戲裡看到一團火,不妨多看兩眼。它是貼圖、是粒子、還是流體?它會不會蔓延?它燒完之後留下什麼?它是不是在引導你走某條路、或者逼你做出某個選擇?當你開始問這些問題,火焰就不再只是背景,而是一套可以被閱讀、被利用、甚至被破解的系統。
而這,也正是遊戲設計最有趣的地方:最華麗的效果,往往藏著最樸素的邏輯。看懂了邏輯,你就不只是在玩遊戲,而是在讀懂遊戲。
```
💬 想說點什麼?
歡迎到留言板分享你的想法、心得或疑問。
💬 前往留言板 →