粒子系統(tǒng)的關(guān)鍵概念
在虛幻中使用粒子以及級聯(lián)粒子編輯器時的一些關(guān)鍵概念
粒子系統(tǒng) 和 級聯(lián) 粒子系統(tǒng)編輯器都是靈活并強大的。然后,在開始真正動手干活前,有一些重要的概念需要預(yù)先了解。這篇文章的目的就是要介紹這些重要概念,為粒子系統(tǒng)如何工作提供扎實的原理基礎(chǔ),但并不討論界面使用上的細節(jié),也不對特定粒子效果如何制作進行說明。
粒子特效的模塊化做法
關(guān)于級聯(lián)的主要的概念就是對粒子系統(tǒng)進行模塊化的設(shè)計。在一些其他軟件的特效功能中,比如 Maya,一個粒子效果要創(chuàng)建的話需要先定義大部分行為的屬性,然后用戶再對這些屬性進行修改來獲得希望中的效果。
在級聯(lián)中,則是另外一種做法,一個粒子系統(tǒng)創(chuàng)建后只有很少的 最基礎(chǔ) 的屬性,以及一些行為模塊。
每個模塊代表了粒子行為的一個特定方面,并只對行為的該方面提供屬性參數(shù),比如顏色、生成的位置、移動行為、縮放行為,及其他等。用戶可以在需要的時候添加或者刪除一個模塊,來進一步定義粒子的整體行為。由于這里的結(jié)果中只有必要的模塊才會被添加進來,因此并沒有額外的計算,也沒有不需要的屬性變量的參與。
最棒的是,模塊可以很容易的被添加、刪除、拷貝,甚至在一個粒子系統(tǒng)中從其他發(fā)射器實例化過來,一旦用戶熟悉了有哪些可用的模塊和它們的功能后,制作一個復(fù)雜的粒子系統(tǒng)也會變得非常容易。
有些模塊在粒子發(fā)射器默認存在。在一個新的面片發(fā)射器 - 粒子系統(tǒng)的關(guān)鍵組件 - 被添加到粒子系統(tǒng)中,一下這幾個 默認 模塊都會隨之創(chuàng)建:
Required - 這里包含了一些屬性,都是對粒子系統(tǒng)絕對需要用到的屬性,比如粒子使用的材質(zhì),發(fā)射器發(fā)射粒子的時間,以及其他。
Spawn - 這個模塊控制粒子從發(fā)射器生成的速度,它們是否以 Burst 生成,以及其他和粒子發(fā)生時機有關(guān)的屬性。
Lifetime - 這里定義了每個粒子在生成后存在的時間,如果沒有這個模塊,粒子則會一直持續(xù)下去。
Initial Size - 這里對粒子生成時的縮放比例進行控制。
Initial Velocity - 這里對粒子生成時的移動進行控制。
Color Over Life - 這個模塊用于控制每個粒子的顏色在過程中如何改變。
Required 和 Spawn 這兩個模塊是永久模塊,無法從發(fā)射器內(nèi)移除。其他一些模塊都可以按需刪除。
模塊分類
有很多模塊可用于粒子發(fā)射器上。為了避免混淆,這些模塊分為以下幾種類別:


初始狀態(tài) vs. 生命周期
在使用粒子模塊工作的時候要對兩個概念有所了解,他們是 初始狀態(tài) 和 生命周期 或者叫 每次生命 屬性。
初始狀態(tài) 的模塊一般用于管理粒子被生成那一刻的各方面屬性。
生命周期 或者 每次生命 的模塊是為了對粒子的生命過程中對它們的屬性進行修改的方面。
比如,初始顏色 的模塊能夠為粒子生成那一刻指定顏色屬性,而 生命周期顏色 的屬性則是用于在粒子生成后,直到被消亡前的這段過程中逐漸修改顏色的行為。
模塊時間計算
如果將一個屬性設(shè)置為 distribution 的類型,那么它就會在時間過程上發(fā)生變化,有些模塊使用"相對時間"而有些模塊使用"絕對時間"(下面的 distribution 部分有更多說明)。
絕對時間基本上就是外部發(fā)射器的計時。如果發(fā)射器的設(shè)置是每個循環(huán) 2 秒,一個三次循環(huán),那么在這個發(fā)射器內(nèi)的模塊的絕對時間將是從 0 到 2,會運行 3 遍。
相對時間在 0 到 1 之間,表示每個粒子在生命周期中的時間。
對當(dāng)前可用模塊的描述可以在 粒子系統(tǒng)參考 頁面內(nèi)的模塊類型頁面。
發(fā)射器,粒子系統(tǒng),以及發(fā)射器 Actor
在使用級聯(lián)制作粒子效果的時候,需要始終記住每個對象之間的互相作用關(guān)系。在這篇文檔中我們已經(jīng)討論了模塊的概念,但模塊只是粒子特效中的一個組件。總的來說,粒子系統(tǒng)的組件包括模塊、發(fā)射器、粒子系統(tǒng),以及發(fā)射器 Actor??梢杂靡韵旅枋鰜碛涀∵@些概念之間的關(guān)系:
模塊,定義粒子的行為,并且被放置在一個發(fā)射器中。
發(fā)射器,為展示效果發(fā)射特定行為的粒子,任意個發(fā)射器可以被同時放置在一個粒子系統(tǒng)內(nèi)。
粒子系統(tǒng),作為 內(nèi)容瀏覽器 中的一個資源,可以被一個發(fā)射器 Actor 來引用。
發(fā)射器 Actor,是一個放置在關(guān)卡中的東西,用于定義粒子在場景中如何使用。
粒子的運算
當(dāng)使用粒子系統(tǒng)時,了解運算的次序也是很重要的。在級聯(lián)編輯器中,列表區(qū)域的每列都代表了一個發(fā)射器,一列中的每個塊代表一個模塊。運算時的次序如下:
發(fā)射器的運算是根據(jù)發(fā)射器的列表從左往右的。
模塊的計算按照堆棧列表從上到下的。
發(fā)射器類型
正如特效本身有各種不同的類型一樣,發(fā)射器也分為不同的類型來制作各種特效。下面是目前可用的發(fā)射器類型:
需要注意的是,無論什么類型,發(fā)射器默認都是面片發(fā)射器??梢蕴砑硬煌陌l(fā)射器 類型數(shù)據(jù) 模塊,改變發(fā)射器的類型。
Sprite Emitters - 這是發(fā)射器的基本類型,也是用的最廣泛的類型。使用始終朝向攝像機的多邊形化的面片(2 個多變形組成)作為單個粒子發(fā)射??梢杂脕碜鰺熿F、火焰特效,以及其他各種種類的效果。
AnimTrail Data - 用于創(chuàng)建動畫的拖尾效果。
Beam Data - 用于創(chuàng)建光束效果,比如鐳射光、閃電等類似的效果。
GPU Sprites - 這是特殊類型的粒子,在運行時大量計算交給 GPU 執(zhí)行。這將 CPU 的粒子特效計算從幾千的數(shù)量級提高到 GPU 計算特效的幾十萬的數(shù)量級,取決于具體的目標系統(tǒng)上 GPU 的類型。
Mesh Data - 不再發(fā)射一系列的面片,這個類型的發(fā)射器將會發(fā)射多邊形模型。用于創(chuàng)建巖石塊,廢墟等類似的效果。
Ribbon Data - 這個會產(chǎn)生一串粒子附屬到一個點上,能在一個移動的發(fā)射器后形成一個色帶。
參數(shù)
特效系統(tǒng)中并不是每個部分都可以被預(yù)先定義下來。有時候,特效系統(tǒng)中一部分需要在運行時被控制及變化才能做到好的效果。比如,想要做一個魔法效果,該效果會隨著能量的消耗而有變化,而能量消耗是基于施法行為的。在這種情形下,就需要向特效系統(tǒng)中添加參數(shù)。
一個 參數(shù) 是指一種能夠?qū)?shù)據(jù)發(fā)送給其他系統(tǒng),并從其他系統(tǒng)接受數(shù)據(jù)的屬性,其他系統(tǒng)包括藍圖、Matinee、一個材質(zhì),或者其他來源。在級聯(lián)中,幾乎任何一個給定的屬性都能夠被設(shè)定到一個參數(shù)上,也就意味著屬性能夠從粒子系統(tǒng)外部來控制。
舉個例子,將一個火焰特效的 Spawn Rate 設(shè)置成參數(shù)并在游戲中實時的根據(jù)玩家情況來增加或減小該數(shù)值,就能讓玩家控制火焰特效的強度。
相反,在粒子系統(tǒng)中添加到模塊中的參數(shù),也能用來驅(qū)動其他系統(tǒng)。比如驅(qū)動一個在關(guān)卡中放置的給定材質(zhì)的顏色。
在級聯(lián)中,參數(shù)通常是通過 Distributions 的方式來建立的,這也是處理一個屬性上數(shù)據(jù)的方式。
粒子的光照
粒子系統(tǒng)可以被設(shè)置為接受光照,這需要特別去設(shè)置。
要設(shè)置光照粒子的話:
1.材質(zhì)要使用除 unlit 以外的 shading model。使用 DefaultLit 將能夠處理法線貼圖、高光等。
2.在級聯(lián)的 LODSettings 中(在 LOD 屬性中,可以看到這是所有模塊和發(fā)射器都會處于非選中狀態(tài)),每個 LOD 中有一個標記叫做 bLit。該標記需要被勾選。這個標記只能在級聯(lián)中更新。
遵循這些過程將使粒子在游戲中以光照模式顯示。它們從發(fā)射器的位置接受光照,因此要移動原始的位置觀察一下光照效果,或者在附近放置動態(tài)光源。
細節(jié)級別(LODs)
粒子系統(tǒng)很輕易的變得非常消耗性能。即使是使用 GPU 粒子時,雖然已經(jīng)將大量的粒子運算轉(zhuǎn)移到 GPU 上,但仍然需要考慮不同的粒子離玩家的遠近以及它們產(chǎn)生的實際效果。
比如,假設(shè)有一堆營火,如果靠近看的話,可能會看見火焰的余燼和火花在煙霧中顯現(xiàn)。然后,如果觀察點在幾百米遠處,余燼的效果會小到比任何顯示器一個像素的尺寸還小,那何必還在這上面進行運算?
這時就需要細節(jié)級別(LODs)的介入。LOD 系統(tǒng)能夠自定義距離范圍,超過一定距離后粒子系統(tǒng)則會自動簡化。每個距離范圍對應(yīng)一個 LOD。簡化的介入就是使用較低的數(shù)值,禁用一些模塊,甚至禁用一些發(fā)射器。比如上面舉的營火的例子中,最好就是一旦玩家遠離了一定的距離后就徹底的禁用那些創(chuàng)建火花的發(fā)射器。
粒子系統(tǒng)可以有任意數(shù)量的 LODs,并且可以為每個 LOD 設(shè)定距離范圍。
Distributions
Distribution 是一組數(shù)據(jù)類型,以特殊的方式處理數(shù)據(jù),比如為一個數(shù)值應(yīng)用一個范圍,或者使用曲線來對數(shù)值做插值操作。如果粒子系統(tǒng)需要任何隨機屬性,或者粒子需要隨著時間進行變化時,就需要使用一個 distribution 來控制屬性。
在級聯(lián)中的很多模塊的屬性中都可以看到使用了各種不同的 distribution。屬性的實際數(shù)值就是通過 distribution 來設(shè)置的。
有 5 種主要的 distribution 類型:
Constant - 這表示一個靜態(tài)不變的常量。
Uniform - 一個 Uniform Distribution 提供了一個最小值和一個最大值,輸出這兩個值之間(包含這兩個值)的隨機數(shù)值。
Constant Curve - Constant Curve 提供了一個數(shù)值的簡單曲線。在這個類型下,時間通常是指一個粒子從生成的消失的過程,或者說是粒子的起始時間和結(jié)束時間。
Uniform Curve - Uniform Curve Distribution 提供了最小曲線和最大曲線,最終數(shù)值在這兩個曲線中間來選取。
Parameter - 這種類型的 Distribution 使得該屬性參數(shù)化,以便于它能夠被外部系統(tǒng),諸如藍圖、Matinee 或者其他系統(tǒng)讀取或改寫。
這些 Distribution 的每種類型對浮點型和 Vector 型都單獨存在。比如,這里有 Float Uniform Curve 和 Vector Uniform Curve 兩種 Deistribution。然而無論是使用 Float 型還是 Vector 型的版本,Distribution 是由類型來決定,用戶并沒有選擇。比如對于 Color(這是一個包含了 RGB 的 Vector)只能使用 Vector Uniform Distrution,但 Lifespan(單個 Float 變量)只能使用 Float Uniform Distrution。