用课余时间写了个简单的粒子系统,虽然简单,但是遇到的麻烦不少,最头疼的就是想实现一个粒子慢慢淡出的效果,想用粒子的顶点颜色ALPHA直接实现,但不知为什么,一直没效果,颜色倒是有,ALPHA一直没变化。
不得已加了个全局光并给每个粒子加了个材质才实现了淡出效果。。。但这样就不能一次渲染一堆粒子,只能一个一个渲了,因为每个粒子的材质都不一样。。。。不知道谁有什么解决办法?
![](https://p-blog.csdn.net/images/p_blog_csdn_net/xmujojo/EntryImages/20081223/%E6%88%AA%E5%9B%BE00.jpg)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/xmujojo/EntryImages/20081223/%E6%88%AA%E5%9B%BE01.jpg)
不得已加了个全局光并给每个粒子加了个材质才实现了淡出效果。。。但这样就不能一次渲染一堆粒子,只能一个一个渲了,因为每个粒子的材质都不一样。。。。不知道谁有什么解决办法?
- //顶点结构和顶点格式
- struct POINTVERTEX
- {
- D3DXVECTOR3 v;
- static const DWORD FVF = D3DFVF_XYZ;
- };
- //-----------------------------------------------------------------------------
- // Desc: 粒子结构
- //-----------------------------------------------------------------------------
- class PARTICLE
- {
- public:
- D3DXVECTOR3 m_vPos; //当前位置
- D3DXVECTOR3 m_vVel; //当前速度
- float m_fSize;
- float m_fGSpeed;
- float m_fLifeTime; //生命值 可用作表示ALPHA
- FLOAT m_fTotalLifeTime; //生命全值
- D3DMATERIAL9 m_material; //粒子材质
- PARTICLE* m_pNext; //指向下一粒子的指针
- };
- //渲染粒子
- while( pParticle )
- {
- pVertices->v = pParticle->m_vPos; //点图元的位置
- pd3dDevice->SetMaterial( &pParticle->m_material );
- pd3dDevice->SetRenderState( D3DRS_POINTSIZE, FtoDW(pParticle->m_fSize) ); //粒子大小
- pVertices++;
- if( ++dwNumParticlesToRender == m_dwFlush ) //填充完毕指定的数据块
- {
- m_pVB->Unlock();
- V_RETURN(pd3dDevice->DrawPrimitive( D3DPT_POINTLIST,
- m_dwBase, 1));
- m_dwBase ++;
- if(m_dwBase >= m_dwDiscard)
- m_dwBase = 0;
- V_RETURN(m_pVB->Lock( m_dwBase * sizeof(POINTVERTEX), m_dwFlush * sizeof(POINTVERTEX),
- (void**) &pVertices, m_dwBase ? D3DLOCK_NOOVERWRITE : D3DLOCK_DISCARD ));
- dwNumParticlesToRender = 0; //将需要渲染的顶点数重新置零
- } //end if
- pParticle = pParticle->m_pNext;
- } //end while
- // Unlock the vertex buffer
- m_pVB->Unlock();
![](https://p-blog.csdn.net/images/p_blog_csdn_net/xmujojo/EntryImages/20081223/%E6%88%AA%E5%9B%BE00.jpg)
![](https://p-blog.csdn.net/images/p_blog_csdn_net/xmujojo/EntryImages/20081223/%E6%88%AA%E5%9B%BE01.jpg)
效果图