许多自然现象都包含了大量行为相似的微小粒子
,粒子系统
通常用来模拟此类现象
1、粒子和点精灵
在DirectX 8.0
之前,我们使用点图元(由D3DPRIMITIVETYPE类型的D3DPT_POINTLIST枚举常量来表示)
来表示一个粒子(Particle)
·。但光栅化时,点图元将被映射为一个单个像素
,这样就无法为我们提供很大的灵活性,因为实际应用中我们可能需要各种尺寸的粒子
甚至希望能够对这些粒子进行纹理映射
所以在8.0版本
之前,程序员都愿意用广告牌(billboard)
技术来显示一个粒子
广告牌
:一个四边形,通过对其自身世界变换矩阵
的控制,使其总是面向摄像机
9.0版本引入了一种特别的点图元
——点精灵(Point Sprite)
,该图元极适合应用于粒子系统中
点精灵与普通的点图元不同,点精灵可进行纹理映射且其尺寸可变
;其之于billboard来说,点精灵只需要一个顶点,这样就节省了内存和宝贵的运算时间
1.1、结构格式
点精灵的结构格式
和普通点图元的结构格式很类似
我们可以为灵活顶点格式FVF
增加D3DFVF_PSIZE标记
来让每个粒子对象
维护其自身的尺寸。但大多数显卡都不支持
按照这种方式控制粒子的尺寸(可检查结构D3DCAPS9中的成员FVFCaps中的D3DFVFCAPS_PSIZE位来验证)
我们通常通过绘制状态来控制粒子的尺寸
也可以在VS中通过顶点声明
来控制每个粒子的尺寸
1.2、点精灵的绘制状态
- 1、
D3DRS_POINTSPRITEENABLE
: - 2、
D3DRS_POINTSCALEENABLE
: - 3、
D3DRS_POINTSIZE
: - 4、
D3DRS_POINTSIZE_MIN
: - 5、
D3DRS_POINTSIZE_MAX
: - 6、用于计算
最终尺寸
的三个绘制状态:
1.3、粒子及其属性
一个粒子除了位置和颜色
外往往还具有许多其他的属性
通常将用于绘制粒子的数据
与粒子的属性
分别存储在两个不同的结构中。当我们要创建、销毁或更新粒子时,需要涉及粒子的属性;当我们准备绘制粒子时,可将粒子的位置和颜色信息复制到Particle结构
中
粒子的属性
与我们所要模拟的粒子系统的特定类型
息息相关。但是,我们通过指定一些常用属性可以使这个结构变得通用一些
struct Attribute
{
D3DVECTOR3 _position;
D3DVECTOR3 _velocity;
D3DVECTOR3 _acceleration;
float _lifeTime;
float _age;
D3DXCOLOR _color;
D3DXCOLOR _colorFade;
bool _isAlive;
}
2、粒子系统的组成
粒子系统(Particle System)
是众多粒子的集合,并负责对这些粒子进行维护和显示
。粒子系统跟踪系统中影响所有粒子状态的全局属性
按照功能,粒子系统主要负责:
- 1、
更新(updating)
: - 2、
显示(displaying)
: - 3、
杀死(kill)
: - 4、
创建(creating)
:
为所有具体种类的粒子系统封装一个抽象基类
因为我们需要在每一帧中对粒子进行更新
,这就意味着我们需要频繁的访问顶点缓存
。又因为静态顶点缓存
的访问速度相当慢,所以我们将顶点缓存指定为动态的(动态缓存)
我们使用了默认的内存池
而非常用的托管内存池
,这是因为动态顶点缓存不允许被放置在托管内存池中
对于某些粒子系统,回收
那些处于死亡状态的粒子比销毁
它们有更多的优势
2.1、绘制一个粒子系统
有两种绘制方法,建议使用第二种
这里需要和之前的代码放在一起看,并且涉及到内存的类型
。需要使用的时候彻底掌握
2.2、随机性
用随机数引擎随机的设置粒子的大小和位置
3、具体的粒子系统
- 1、
雪花系统
: - 2、
焰火系统
: - 3、
粒子枪
: