自然界中有现象包含了大量的行为相同的,微小粒子,比如:雪花,烟火等,粒子系统通常用来描述这些场景。
粒子是自然界中一种微小的东西,所以显示例子的最好的方法就是使用点图元,但是点图元在被光栅化的时候会被映射为一个像素,此时我们就无法去灵活的操作他,因为我们要去经常的改变他的大小,或者去给这个图元映射纹理。很早之前有一个技术叫做:广告牌,广告牌就是一个四边形,通过控制他的世界矩阵,来使其总面向摄影机。
但是后来引进了一个新的点图元:点精灵。点精灵可以改变大小以及进行纹理的映射,但是不同于广告牌的是,点精灵只需要一个点,而广告牌需要4个点,这样一来就节省了大量的运算时间。
我们使用如下的顶点结构来描述粒子的位置和颜色:
struct Particle
{
D3DXVECTOR3_position;
D3DCOLOR _color;
static const DWORD FVF;
}
const DWORD Particle::FVF=D3DFVF_XYZ | D3DEVF_DIFFUSE;
该结构仅储存了粒子的位置和颜色,也可以根据程序为结构里面添加纹理坐标。
有时候我们需要在Particle里面添加一个浮点类型的变量,来控制点精灵的尺寸的变换,然后为了反映该变化,我们需要在灵活顶点格式里面添加D3DFVF_PSIZE标记,但是大多数的图形卡都不支持这种方式进行点精灵的尺寸控制,我们可以通过绘制状态来控制点精灵的尺寸。
下面是一个顶点结构中含有尺寸成员的例子:
struct Particle
{
D3DXVECTOR3_position;
D3DCOLOR_color;
float _size;
static const DWORD FVF;
}
const DWORD Particle::FVF=D3DEVF_XY2 | D3DFVF_DIFFUSE | D3DFVF_PSIZE;
注意:即使硬件不支持:D3DFVF_PSIZE标记,我们还是可以通过像素着色器来控制粒子的大小。
点精灵的绘制状态
点精灵的行为很大程度上是由绘制状态控制的。绘制状态有以下:
D3DRS_POINTSPRITEENABLE
一个布尔值,默认值是false
若指定为true,则规定整个当前纹理被映射到点精灵上。
若指定为false,则规定点精灵(如果其顶点结构中含纹理坐标的话)的纹理坐标所指定的纹理元应被映射到点精灵上。