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 );
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);
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?
Eso es por el filtrado de textura...prueba a desactivarlo
Saludos
eso era, gracias :)
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