Jump to content

  • Log In with Google      Sign In   
  • Create Account


Particle rendering problem


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
No replies to this topic

#1 -Tau-   Members   -  Reputation: 121

Like
0Likes
Like

Posted 21 September 2012 - 03:19 AM

Hi all,
I need som advice for vertex declaration / FVF with particles. Main issue is the texture on particles.
When i first created particle class and class to manipulate with particles, particle vertex had position normal and texcoord. After a while i understood that particle do not need a normal so i removed it. After that particle were either not drawn or drawn with only 1 color. First i used FVF, then i changed to vertex declaration in hope it will solve this problem.


struct PARTICLEVERTEX

{

	D3DXVECTOR3 pos;

	float tu, tv;

};



#define D3DFVF_PARTICLEVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)



void ParticleSystem::OnCreate(IDirect3DDevice9* pd3dDevice)

{

	PARTICLEVERTEX *_Vertices = new PARTICLEVERTEX[4];

	VOID *_pVertices;

	pd3dDevice->CreateVertexBuffer( 4* sizeof( PARTICLEVERTEX ),

									0, 0,

									D3DPOOL_MANAGED, &m_pVB, NULL );

	m_pVB->Lock( 0, 0, ( void** )&_pVertices, 0 );

	{

		_Vertices[0].pos=D3DXVECTOR3(-0.5 , -0.5, 0);

		_Vertices[0].tu=0;

		_Vertices[0].tv=1;

		_Vertices[1].pos=D3DXVECTOR3(-0.5 , 0.5, 0);

		_Vertices[1].tu=0;

		_Vertices[1].tu=0;

		_Vertices[2].pos=D3DXVECTOR3(0.5 , -0.5, 0);

		_Vertices[2].tu=1;

		_Vertices[2].tv=1;

		_Vertices[3].pos=D3DXVECTOR3(0.5 , 0.5, 0);

		_Vertices[3].tu=1;

		_Vertices[3].tv=0;

	}

	memcpy( _pVertices, _Vertices, sizeof(PARTICLEVERTEX)*4 );

	m_pVB->Unlock();

	delete []_Vertices;



	D3DVERTEXELEMENT9 f_par_VDecl[] =

	{

		{ 0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },

		{ 0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },

		D3DDECL_END()

	};



	pd3dDevice->CreateVertexDeclaration( f_par_VDecl, &m_pDecl );

}



void ParticleSystem::draw(ID3DXEffect* pEffect, IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime)

{

	if (!pfpar)

		return;



	if (pfpar->time_to_die<fTime)

	{

		particle *tdelete=pfpar;

		pfpar=pfpar->pnext;

		delete tdelete;

	}



	particle *akt=pfpar;



	UINT iP,cP;

	HRESULT hr;

	D3DXMATRIXA16 mWorld;

	pd3dDevice->SetStreamSource( 0, m_pVB, 0, sizeof( PARTICLEVERTEX ) );

	pd3dDevice->SetVertexDeclaration( m_pDecl );



	while (akt)

	{

		if (akt->pnext)

			if (akt->pnext->time_to_die<(float)fTime)

			{

				particle *tdelete=akt->pnext;

				akt->pnext=akt->pnext->pnext;

				delete tdelete;

			}



		akt->move(fTime, fElapsedTime);

		D3DXMatrixTranslation(&mWorld, akt->pos.x, akt->pos.y, akt->pos.z);



		V( pEffect->SetTexture( g_efn->g_txScene, v_ints_tex[akt->i_tex].v_tex[akt->akt_texture] ) );

		

		V( pEffect->SetFloat( g_efn->particleScale, akt->scale) );

		V( pEffect->SetVector( g_efn->g_MaterialColor, &akt->color) );

		V( pEffect->SetMatrix( g_efn->g_mWorld, &mWorld ) );

		V( pEffect->Begin( &cP, 0 ) );

		for( iP = 0; iP < cP; iP++ )

		{

			V( pEffect->BeginPass( iP ) );

			pd3dDevice->DrawPrimitive(	D3DPT_TRIANGLESTRIP, 0, 2);

			pEffect->EndPass();

		}

		pEffect->End();



		akt=akt->pnext;

	}

}



////////////////////

////////////////////

void ParticleVS(float4 iPos : POSITION,

				float2 iTex : TEXCOORD0,

				out float4 oPos : POSITION,

				out float2 oTex : TEXCOORD0)

{

	float4x4 wv = mul(g_mWorld, g_mView);

	oPos = iPos*float4(particleScale, particleScale, particleScale, 1.0) + float4(wv._41, wv._42, wv._43, 0.0);

	oPos = mul( oPos, g_mProj );

	oTex = iTex;

}



float4 ParticlePS(float2 iTex : TEXCOORD0) : COLOR0

{

	return tex2D(g_samScene, iTex)*g_MaterialColor;

}

Edited by -Tau-, 23 September 2012 - 01:42 AM.


Sponsor:



Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS