简单的粒子系统~~

    用课余时间写了个简单的粒子系统,虽然简单,但是遇到的麻烦不少,最头疼的就是想实现一个粒子慢慢淡出的效果,想用粒子的顶点颜色ALPHA直接实现,但不知为什么,一直没效果,颜色倒是有,ALPHA一直没变化。    
    不得已加了个全局光并给每个粒子加了个材质才实现了淡出效果。。。但这样就不能一次渲染一堆粒子,只能一个一个渲了,因为每个粒子的材质都不一样。。。。不知道谁有什么解决办法?

  1. //顶点结构和顶点格式
  2. struct POINTVERTEX
  3. {
  4.     D3DXVECTOR3 v;
  5.     static const DWORD FVF = D3DFVF_XYZ;
  6. };


  7. //-----------------------------------------------------------------------------
  8. // Desc: 粒子结构
  9. //-----------------------------------------------------------------------------
  10. class PARTICLE
  11. {
  12. public:
  13.     D3DXVECTOR3 m_vPos;       //当前位置
  14.     D3DXVECTOR3 m_vVel;       //当前速度
  15.     

  16.     float           m_fSize;
  17.     float           m_fGSpeed;
  18.     float           m_fLifeTime;        //生命值  可用作表示ALPHA
  19.     FLOAT       m_fTotalLifeTime;     //生命全值
  20.     D3DMATERIAL9    m_material; //粒子材质

  21.     PARTICLE*   m_pNext;      //指向下一粒子的指针

  22. };

 
  1.     //渲染粒子
  2. while( pParticle )
  3. {
  4.     pVertices->v  = pParticle->m_vPos;         //点图元的位置

  5.     pd3dDevice->SetMaterial( &pParticle->m_material );

  6.     pd3dDevice->SetRenderState( D3DRS_POINTSIZE,     FtoDW(pParticle->m_fSize) );  //粒子大小

  7.     pVertices++;
  8.     
  9.     if( ++dwNumParticlesToRender == m_dwFlush )  //填充完毕指定的数据块
  10.     {
  11.         m_pVB->Unlock();
  12.         V_RETURN(pd3dDevice->DrawPrimitive( D3DPT_POINTLIST,
  13.                     m_dwBase, 1));

  14.         m_dwBase ++;
  15.         if(m_dwBase >= m_dwDiscard)
  16.             m_dwBase = 0;

  17.         V_RETURN(m_pVB->Lock( m_dwBase * sizeof(POINTVERTEX), m_dwFlush * sizeof(POINTVERTEX),
  18.             (void**) &pVertices, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ));
  19.         dwNumParticlesToRender = 0;  //将需要渲染的顶点数重新置零
  20.     } //end if

  21.     pParticle = pParticle->m_pNext;

  22. //end while

  23.  // Unlock the vertex buffer
  24. m_pVB->Unlock();



     效果图
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值