D3D-粒子系统

Published: 24 Feb 2014 Category: 游戏研发

在计算机系统中,描绘一些模糊的物体如烟花、火焰、水、云、雪花等视觉效果,就需要使用粒子系统。

例子几何特征十分简单,可以采用一个小四边形表示。最大的缺陷是对机器性能要求较大。

粒子系统有三个要素: - 群体性:大量元素构成,单独的粒子没有意义。 - 统一性:粒子具有相同的表现规律。 - 随机性:每个元素在每个时刻都是随机的表现不同的特性。

粒子系统在运行的时候需要遵循一定的规则,没个粒子在存在期间的运动分别受宏观和微观的作用。

从宏观上来说,体现了粒子的统一性,它们作为一个整体要遵循一类规则。

从微观上来说,体现了粒子的随机性,同时为了粒子系统模拟的物体,需要有不同的规则。如火焰,他表示炙热的碳粒,如果出于高密度区,就会向低密度区扩散。 粒子系统要解决的

粒子系统基本原理

粒子通常是一个带有纹理的四边形,同时使用纹理赋予它外表。同时,每个粒子都具有一定的属性,如空间位置、外观、运动、生存周期等。

粒子系统在宏观和微观上都有一定的规则,在生命周期中的某一时刻,一般需要完成一下四步工作:

  1. 产生新粒子:根据需求,产生一定数量的粒子,并为其属性赋值。
  2. 更新现有粒子的属性:目前还在生存周期内的粒子在每一时刻都可能出现属性的变化,比如雪花的下降,这时候就需要对其重新计算并赋值。
  3. 删除消亡属性:对于超过了生命周期的粒子,将它删除。有的粒子系统中的粒子生命周期无尽,不存在消亡,就可以忽略这一步。
  4. 绘制出粒子:根据例子的属性,对其绘制。

一般使用点精灵(Point Sprite)的特殊点元表述粒子。和一般点元不同的是点精灵可以映射纹理并改变大小。

此外,需要一个保存粒子的数据结构,一般可以用数组,需要动态管理的可以使用链表。

需要注意的是,因为粒子系统中会有很多粒子需要不断地产生、消亡,如果在每个粒子产生时都分配内存,或者在每个粒子消亡时都释放内存,这显然会造成巨大的资源开销,非常不推荐。这里我们按链表这种方案来讲解。 我们通常采用的做法是,未雨绸缪,预先为所有的粒子分配内存,并将这些粒子保存到一个链表当中。同时设置两个链表,一个存储生存的链表(需要渲染的粒子),另一个存储其他粒子(刚开始粒子都在这个链表)。当需要产生新的粒子时,从这个链表中取出所需数量的粒子,并将它们加入到渲染链表中,而当一个粒子消亡后,重新将它们放回到原链表中,并从渲染链表中删除这些粒子。最后,在程序结束时,统一一次性释放所有粒子所占的内存空间。这就是比较科学的做法。