第14章 粒子系统

版权声明:转载请注明出处 https://blog.csdn.net/weixin_39918693/article/details/88780099

许多自然现象都包含了大量行为相似的微小粒子粒子系统通常用来模拟此类现象


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、粒子枪

猜你喜欢

转载自blog.csdn.net/weixin_39918693/article/details/88780099