基于DIRECTX的3D粒子系统构建4

来源:互联网 发布:克洛普 知乎 编辑:程序博客网 时间:2024/05/16 12:36

 

 

4、 粒子池

 

class CParticalPool

{

private:

       LPPARTICLENODE m_lpParticalUnit;//存放粒子的内存空间

int m_iFreePointer;        //空闲粒子的指针

LPWORD m_lpwFreeStack;//空闲粒子的编号存储栈

 

 

public:

CParticalPool();

bool Init( int iMaxParticalNum );//初始化最大数量的存放空间并初始化空闲栈和指针

void Clear();   //清除池

LPPARTICLENODE GetParticalNode();//取得空闲粒子

void FreeParticalNode( LPPARTICLENODE lpParticalNode );//死亡的粒子会回到空闲栈

};

 

 

下面是一些主要函数的代码:

bool CParticalPool::Init( int iMaxParticalNum )

{

       申请iMaxParticalNum大小的粒子空间;

       申请iMaxParticalNum大小的粒子编号空闲栈

 

 

       for( int iFIndex = 0; iFIndex < iMaxParticalNum; iFIndex++ )

       {

               初始化粒子编号和粒子编号空闲栈

       }

       空闲栈指针初始化到栈顶

 

 

       return TRUE;

}

 

 

LPPARTICLENODE CParticalPool::GetParticalNode()

{

       if( m_iFreePointer >= 0 )

               从空闲栈中弹出栈顶元素;

       else

               return NULL;

}

 

 

void CParticalPool::FreeParticalNode( LPPARTICLENODE lpParticalNode )

{

       lpParticalNode的编号压入空闲栈;

}

 

 

 

 

5、 其他的优化措施

 

如果每次出现在屏幕的粒子数目是可控的(始终等于或小于某个数量),那么在粒子系统的每次变换时,可以把粒子的顶点数据填充到一整块BUFFER中,然后在RENDER时一起绘制,这样,只需要在粒子发射器中保存一块LPDIRECT3DVERTEXBUFFER9就行了,不过这种方法可能不适用于Point Sprites粒子,因为Point Sprites粒子的大小是通过设置渲染状态来实现的,因此,需要在绘制每一个粒子时设定他的D3DRS_POINTSIZE渲染状态,这种情况下,应该为每一个粒子保存他的顶点数据。

 

 

 

 

 

 

 

 

四、结语

 

利用上述方法,我们可以产生很多效果绚丽的粒子效果,下面是笔者所在项目使用的一些粒子特效的截图:

 

           

 

粒子系统是是3D游戏中必不可少的组成元素,很多著名的游戏引擎都提供强大的粒子系统以及供美工使用的粒子编辑器。在笔者的工作经历中,见到的粒子编辑器以LITHTECH的最为强大和绚丽。下面是LITHTECH粒子编辑器的截图

 

 

 

 

 

这些强大的粒子编辑器有更加复杂的设计,比如考虑多层粒子,粒子间相互作用等因素,但最根本的设计仍然是从上面的粒子基本结构而来。最后,希望能够与业界的朋友在3D游戏的研究方面共同讨论,共同提高。笔者的邮箱:dksiren@163.com

 

原创粉丝点击