3D遊戲引擎特效系統設計

本文轉自:http://blog.csdn.net/shadow_gz/article/details/6359220

特效系統

對於通用化的特效,圖形效果,我設計結構是如下:

第一部分:

EntitySource  特效的渲染實體,封裝了各種類型特效的渲染。

現已經支持了粒子特效,序列幀動畫,地形貼花等

繼承其的子類:

EffectSourceBase UV動畫,模型動畫,粒子特效

EffectAureSoure 貼花

EffectMaterialSource 拓展材質

EffectMRTSource MRT熱能擾動

 

EffectSourcePool,每個EffectSource都會對應唯一的EffectSourcePool

通過EffectSourcePool克隆新的EffectSource

通過ID可以輕鬆的辨別特效類別,後期優化可以進行優化,減少狀態切換

EffectSourceManger對EffectSource進行管理,包括資源的加載,刪除,克隆等操作。

第二部分:

EntityEffect  特效的邏輯實體。

不同類別的EntityEffect可帶有不同的EffectProperty,通過EffectBuilder進行組織。

現支持BaseEffect,AureEffect貼花,Material(材質),PostEffect(後處理)。

一個EntityEffect 關聯一個EffectSource,一個EffectTimeController.

EntityEffect Update只對所有的時間控制器EffectControl進行跟新。管理生命週期。

Render對EffectProperty,EffectSource進行更新,更新渲染實體,並執行渲染。

 

EffectEntityManger對EntityEffect進行創建,管理。

一般的特效的創建一般是對EntityEffect的拼裝過程。

EntityEffect對應對外操作: Play()播放Pause()暫停 Stop()結束,請不要手動Delete EntityEffect若要撤銷刪除EntityEffect調用Stop()。

第三部分:

EffectController 時間控制器,管理EntityEffect的生命週期,以及各種數據運算.把運算邏輯抽出來。一般的EffectSource需要讀取Nif 裏面TimeController的時間控制信息,藉此執行特效資源的Frame Render。

EffectProperty EffectPropertyContainer 封裝了EntityEffect所具有的特性。

PropertyInterpolater 屬性插值器,提供給EffectController 對EntityEffect 的Property進行數據運算 

暫且封裝了兩種類別的插值器:

l  TransformInterpolator:位置計算。封裝了Effect軌跡計算。每個EffectController都需要對應一個唯一的TransformInterpolator(m_pkMainInterpolator)進行軌跡計算。其決定了EffectController的生命週期。現封裝了以下的TransformInterpolator:

1、EffectClampInterpolator:綁定到某一節點(位置)只播放一次。

2、EffectFallOffInterpolator:自由落體運動。

3、EffectFollowInterpolator:一直跟隨某一節點(位置),直到EffectProperties::E_CONTROLEND== FASLE;

4、EffectMissileInterpolator:導彈飛行,追蹤某一節點(位置)

5、EffectParabolaInterpolater:拋物線軌跡計算。

l  EffectFloatInterpolator:

通過PropertyInterpolater對EffectProperty 進行插值計算,比如通常用到的Alpha插值,Scale大小插值。

 

第四部分

組合特效,面對於EntityEffect多個實例我們允許其拼裝。我提供了兩個東西:

CombinProcess 主要是對EntityEffect與 多個EffectTimeController 結合,得到各種不同的效果。

CombinEffectManager 組合特效管理,主要負責對CombinProcess 進行拼裝。

這部分做的大部分工作是根據表格內容拼裝出相應的特效。

 

關於爲何要抽取EntityEffect和EntitySource ,我們可以把物理實體和渲染實體分開,一個關注邏輯運算以及數據驅動一個關注渲染。

比如同一個序列幀動畫爆炸特效,場景裏面有10個爆炸特效的EntitySource都是同一個,資源也是同一個,只不過爆炸的位置和當前的播放的幀不同而已。

最後我還封裝

EntitySourceManager 管理所有的EntitySource,包括了EntitySource的內存池。

EntityEffectManager

舉個實例:

地形貼花系統

EntitySource 是主要渲染的貼花渲染接口

EntityEffect 是邏輯實體,其關注了貼花系統的邏輯變化,比如帶有Property:貼花層數,每層的Alpha值,每層的問題等等。

CombinProcess 裏面描述了EntityEffect 使用MisslieTimeController  的運動軌跡是從點A移動點B,或者BindTimeController一直跟隨人走。

其又描述了EffectTimeController裏面使用PropertyInterpolater對根據幀時間Alpha進行0~1的間插值。並且不斷的替換紋理。

CombinEffectManager 可以包含多個CombinProcess形成一個新的特效。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章