Estoy trasteando con este tema pero tengo un pequeño problema. Si pongo la cámara justamente perpendicular a las particulas se ve de coña, aún cuando "strafeo" con la cámara, también. se ve así:
(http://www.warcraft3es.com/parts1.GIF)
pero si cambio la dirección de la cámara a alguna no-perpendicular, se ve así:
(http://www.warcraft3es.com/parts2.GIF)
el codigo de render es este:
D3DXMATRIX mat;
D3DXMatrixIdentity(&mat);
dev->SetTransform(D3DTS_WORLD,&mat);
if (!texture->Set(dev))
Log("Texture Set faileD!");
dev->SetRenderState(D3DRS_POINTSPRITEENABLE, true);
dev->SetRenderState(D3DRS_POINTSCALEENABLE, true);
dev->SetRenderState(D3DRS_POINTSIZE, FtoDW(0.08f));
dev->SetRenderState(D3DRS_POINTSIZE_MIN, FtoDW(size.min));
dev->SetRenderState(D3DRS_POINTSIZE_MAX, FtoDW(size.max));
dev->SetRenderState(D3DRS_POINTSCALE_A, FtoDW(0.00f));
dev->SetRenderState(D3DRS_POINTSCALE_B, FtoDW(0.00f));
dev->SetRenderState(D3DRS_POINTSCALE_C, FtoDW(1.00f));
dev->SetRenderState(D3DRS_SRCBLEND, srcBlendMode);
dev->SetRenderState(D3DRS_DESTBLEND, destBlendMode);
dev->SetVertexShader(FVF_PARTICLE1);
VERTEX_PARTICLE *verts;
verts = new VERTEX_PARTICLE[GetActiveParts()];
int j=0;
for (int i=0;i<numParticles;i++)
{
if (particles[i].age < particles[i].lifetime)
{
verts[j].position = particles[i].pos;
verts[j].color = D3DCOLOR_ARGB((BYTE)particles[i].color.a,
(BYTE)particles[i].color.r,(BYTE)particles[i].color.g,
(BYTE)particles[i].color.b);
verts[j].pointsize = particles[i].size;
j++;
}
}
if (FAILED(dev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE)))
Log("ERROR! SetTextureStageState: D3DTSS_COLOROP");
if (FAILED(dev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)))
Log("ERROR SetTextureStageState: D3DTSS_COLORARG1");
if (FAILED(dev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE)))
Log("ERROR! SetTextureStageState: D3DTSS_COLORARG2");
if (FAILED(dev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR)))
Log("ERROR! SetTextureStageState: D3DTSS_MINFILTER");
if (FAILED(dev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR)))
Log("ERROR! SetTextureStageState: D3DTSS_MAGFILTER");
char cad[50];
sprintf(cad,"Active: %d",GetActiveParts());
Log(cad);
if (FAILED(dev->DrawPrimitiveUP(D3DPT_POINTLIST,j,verts,sizeof(VERTEX_PARTICLE))))
Log("Render failed!");
dev->SetRenderState( D3DRS_POINTSPRITEENABLE, FALSE );
dev->SetRenderState( D3DRS_POINTSCALEENABLE, FALSE );
sí, no uso Vb. pero no quiero usarlos hasta que funcione bien todo el tema :P Por cierto, creeis que sería más óptimo lockear/unlockear a cada render para cambiar las propiedades de las partículas, o eso consumiría muchos recursos?
thx in advance :P
Me molan tus post por la fotitos XD.
degiik creo que con los pointsprites de d3d no hace falta usar billboarding, por eso lo digo...
ethernet hay que dar algun aliciente para que la gente los lea xD y una imagen vale más que mil palabras ;P
ya está arreglado, era una parida del zbuffer ;P
No digas quien te ha dado la idea colson de lo del zbuffer xD no no lo digas (tengo log's) ;PPP
xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
vale, a sio el ethernet :P
va tio, no era necesario q me dieras credito xDDD :)
va, dejemos de contestar a este estúpido post XD