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形成一个新的特效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值