Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con sprites en D3D

Iniciado por CoLSoN2, 09 de Febrero de 2003, 12:46:22 AM

« anterior - próximo »

CoLSoN2

                                Bueno, tengo un codigo para renderizar sprites (las modificaciones pertinentes de cámara están a parte), pero el problema es que si ejecuto otro codigo para renderizar sistemas de particulas, el sprite en vez de dibujarse sólo su parte opaca (utiliza color key), se ve un cuadro negro.
El código para el sprite es:


m_dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);

m_dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);



m_dev->SetVertexShader(FVF_VERTEX1);



if(m_texture != NULL)

{

 m_texture->Set(m_dev);

 m_dev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);

if (FAILED(m_dev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1)))

 return 0;

if (FAILED(m_dev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)))

 return 0;

if (FAILED(m_dev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE)))

 return 0;

if (FAILED(m_dev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR)))

 return 0;

if (FAILED(m_dev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR)))

 return 0;



}

else

{

 m_dev->SetTexture(0, NULL);

}



m_dev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, m_pVertices, sizeof(sVERTEX));



m_dev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE);



if (FAILED(m_dev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW)))

 return 0;



y para el sistema d particulas:


);



if (!texture->Set(dev))

 return false;



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->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );

   dev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );





if (FAILED(dev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE)))

 return false;

if (FAILED(dev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE)))

 return false;

if (FAILED(dev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE)))

 return false;

if (FAILED(dev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR)))

 return false;

if (FAILED(dev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR)))

 return false;



dev->SetVertexShader(FVF_PARTICLE1);

dev->SetStreamSource(0,vb,sizeof(VERTEX_PARTICLE));





// todo el rollo del vb dinamico..



dev->SetRenderState( D3DRS_POINTSPRITEENABLE, FALSE );

dev->SetRenderState( D3DRS_POINTSCALEENABLE,  FALSE );

   dev->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );

   dev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );

                               
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

Lord Trancos

                                En el codigo del sprite no veo q estes activando el alpha-blending o el alpha-testing.

Pal alpha-testing (q es para el colorkey, pero no para semi-transparencias/translucideces) usa esto:



 D3DDEV8.SetRenderState(D3DRS_ALPHAREF, 1);

 D3DDEV8.SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);

 D3DDEV8.SetRenderState(D3DRS_ALPHATESTENABLE, 1);

                               
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

CoLSoN2

                                eso soluciona el problema, gracias :)

Aunque verás, el sprite es una cruz roja. (lo he revisado bien y sólo hay color rojo, está hecho pixel a pixel así q..) pero al renderizarlo sale la cruz roja, con un miniborde negro, sabes porque puede ser?                                
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

BeRSeRKeR

                                Eso es por el filtrado de textura...prueba a desactivarlo

Saludos                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

CoLSoN2

                                eso era, gracias :)                                
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

DraKKaR

                                mejor ke desactivar el filtro, podrias poner el wrap mode de la textura en clamp y no en repeat (que es como viene por defecto). Te sale ese borde pq como esta en repeat el pixel del borde de la textura se filtra con el del borde opuesto. Asi podras flitrar la imagen y no dejarla sin filtro ke kedara pixelada :P                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.