Torque學習筆記之二粒子系統

        Torque粒子系統一直是一個頭疼的問題,被外界認爲非常爛,粒子系統編輯器也是非常之爛,跟unreal編輯器比起來相去甚遠,不過TGEA在商業引擎中的性價比絕對是數一數二的了。原先只是看了下粒子系統的參數,試着調過一些粒子效果,不過都不合口味。這必須得深入研究下Torque粒子系統的實現了。

  Torque粒子系統主要有兩個類和Particle結構體組成,ParticleEmitterNode,ParticleEmitter,說到這裏不得不提下Torque的數據塊(datablock)這個概念了,數據塊可以理解爲一個類,但是設計上負責存放數據,而且數據能夠用於網絡傳輸,這個類似於Serialize功能,其中packData和unpackData負責將數據打包和解包,設計上和MFC的Serialize如出一轍。Torque引用數據塊還有一個非常重要的作用就是爲了數據共享,順便也節省資源了。

  說得有些遠了,話回主題ParticleEmitterNode和ParticleEmitter都是集成之GameBase類,於ShapeBase同級。前者的是用於表示放在場景內的粒子系統,也是用於對後者的一種管理,在torque裏一個ParticleEmitterNode只能綁定一個粒子系統,一個粒子發射器最多隻能綁定4個粒子,綁定四個粒子的意思就是產生粒子的時候從這四個裏面隨機的抽一個作爲粒子的屬性,這點有些限制,不過看懂了也是可以改的。ParticleEmitter負責粒子發射的責任,包含以下這三個最主要的函數emitParitcles,advaceTime,prepBatchRender。基本上看懂這三個函數,Torque的粒子系統原理就弄明白了。

         emitParticles這個函數主要用於產生粒子,這裏面大有文章,也有些內存分配的小技巧,首先,粒子發射器不一開始就開闢一塊大的空間用於存放粒子的信息,而是後面產生的,它是以16個位單位產生粒子塊,用完了在生產16個,這樣當然是提高效率的做法了。產生的粒子加入待渲染的列表內。這裏面再細說一下,其中這幾個對象比較重要, part_freelist, part_list_head,其中part_freelist用於保存未使用的粒子列表,採用在頭部插入的鏈表管理,每次開闢16個粒子空間就將其加入到這個鏈表內,part_list_head跟part_freelist類似,用於存放待渲染的粒子。

         advaceTime這個函數是processList管理器執行調用的,是Torque中十分重要的函數,顧名思義,就是每幀渲染前調用的函數,在這裏用於執行更新粒子信息的工作,首先更新粒子的age,如果年齡太大,就讓他去死,話是這麼說,不過死就是讓它重新回到空閒的列表裏,內存是不釋放的,待產生新的粒子利用它的內存。然後更新完age後就是更新一些關鍵幀的信息,我們可以做在關鍵幀內設定粒子的大小、顏色信息。其中間過程採用線性插值。

         prepBatchRender這個函數就是渲染函數,實際上也就是將ParticleEmitter的VertexBuffer信息加入到渲染管道渲染,這個不展開說了,在加入管道前要做很多工作,就是copeVB這個函數要做的事情,首先檢查下是否要擴充VertexBuffer,因爲可能原來申請的空間不夠用,達到可用空間後,就是將每個粒子的信息做渲染前的一次調整,包括Billboard和UV變化,在這裏可以看到torque其實是有粒子序列幀的接口的,只是它並沒有用到。這個以後在把我修改後的代碼附上,可以在torque中播放序列幀的粒子了。

           總結,Torque粒子系統並不是想外界所認爲的那樣非常爛,其實它五臟俱全,除了軟粒子,曲線插值哪些比較高級的特性沒有外,基本算是一個完整的粒子系統。不過不得不說它的粒子編輯器實在太差,讓人無法接受,可能是爲了留個機會給別人做粒子編輯器的生存,或者是它們那幫了爲了偷懶,我也不得而知了。



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