3D游戏引擎的特效系统设计

特效系统

对于通用化的特效,图形效果,我设计结构是如下:

第一部分:

EntitySource  特效的渲染实体,封装了各种类型特效的渲染。

现已经支持了粒子特效,序列帧动画,地形贴花等

继承其的子类:

EffectSourceBase UV动画,模型动画,粒子特效

EffectAureSoure 贴花

EffectMaterialSource 拓展材质

EffectMRTSource MRT热能扰动

 

EffectSourcePool,每个EffectSource都会对应唯一的EffectSourcePool

通过EffectSourcePool克隆新的EffectSource

通过ID可以轻松的辨别特效类别,后期优化可以进行优化,减少状态切换

EffectSourceMangerEffectSource进行管理,包括资源的加载,删除,克隆等操作。

第二部分:

EntityEffect   特效的逻辑实体。

不同类别的EntityEffect可带有不同的EffectProperty,通过EffectBuilder进行组织。

现支持BaseEffectAureEffect贴花,Material(材质),PostEffect(后处理)

一个EntityEffect 关联一个EffectSource,一个EffectTimeController.

EntityEffect Update只对所有的时间控制器EffectControl进行跟新。管理生命周期。

RenderEffectPropertyEffectSource进行更新,更新渲染实体,并执行渲染。

 

EffectEntityMangerEntityEffect进行创建,管理。

一般的特效的创建一般是对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都需要对应一个唯一的TransformInterpolatorm_pkMainInterpolator)进行轨迹计算。其决定了EffectController的生命周期。现封装了以下的TransformInterpolator

1EffectClampInterpolator:绑定到某一节点(位置)只播放一次。

2EffectFallOffInterpolator:自由落体运动。

3EffectFollowInterpolator:一直跟随某一节点(位置),直到EffectProperties::E_CONTROLEND == FASLE

4EffectMissileInterpolator:导弹飞行,追踪某一节点(位置)

5EffectParabolaInterpolater:抛物线轨迹计算。

l  EffectFloatInterpolator

通过PropertyInterpolaterEffectProperty 进行插值计算,比如通常用到的Alpha插值,Scale大小插值。

 

第四部分

组合特效,面对于EntityEffect多个实例我们允许其拼装。我提供了两个东西:

CombinProcess 主要是对EntityEffect 多个EffectTimeController 结合,得到各种不同的效果。

CombinEffectManager 组合特效管理,主要负责对CombinProcess 进行拼装。

这部分做的大部分工作是根据表格内容拼装出相应的特效。

 

关于为何要抽取EntityEffectEntitySource ,我们可以把物理实体和渲染实体分开,一个关注逻辑运算以及数据驱动一个关注渲染。

比如同一个序列帧动画爆炸特效,场景里面有10个爆炸特效的EntitySource都是同一个,资源也是同一个,只不过爆炸的位置和当前的播放的帧不同而已。

最后我还封装

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

EntityEffectManager

举个实例:

地形贴花系统

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

EntityEffect 是逻辑实体,其关注了贴花系统的逻辑变化,比如带有Property:贴花层数,每层的Alpha值,每层的问题等等。

CombinProcess 里面描述了EntityEffect 使用MisslieTimeController   的运动轨迹是从点A移动点B,或者BindTimeController一直跟随人走。

其又描述了EffectTimeController里面使用PropertyInterpolater对根据帧时间Alpha进行0~1的间插值。并且不断的替换纹理。

CombinEffectManager 可以包含多个CombinProcess形成一个新的特效。

 

你可能感兴趣的:(游戏,优化,工作,delete,图形,引擎)