Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: rrbenx en 09 de Marzo de 2006, 07:23:15 PM

Título: Combinar Dos Texturas
Publicado por: rrbenx en 09 de Marzo de 2006, 07:23:15 PM
 Tengo el siguiente problema, tengo dos texturas, una creada para poder ser rendertarget y escribir en ella utilizando D3DXFont y otra cargada mediante D3DXLoadTextureFromFile.

Creo las dos texturas:


       g_pD3DDevice->CreateTexture(1024,512,0,D3DUSAGE_RENDERTARGET,D3DFMT_R5G6B5,
 D3DPOOL_DEFAULT, &g_pMensajeTex, NULL);

if(D3DXCreateTextureFromFile(g_pD3DDevice, L"c:\grande2.png", &g_pImagenTex) != D3D_OK)
{
 MessageBox(NULL, L"Error al cargar textura", L"Error", 0);
}


Escribo el mensaje en una de ellas:

g_pD3DDevice->GetRenderTarget(0, &surface);
g_pMensajeTex->GetSurfaceLevel(0, &surfman);

if (FAILED(g_pD3DDevice->SetRenderTarget(0, surfman)))
{
 MessageBox(0,L"No se puede ligar el nuevo rendertarget", L"Error",0);
}

g_pD3DDevice->BeginScene();
g_pD3DDevice->Clear( 0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DXCOLOR(0.0f,0.0f,0.0f,0.0f), 1.0f, 0L );

RECT rc;
SetRect(&rc,10,220,0,0);

g_pFont->DrawText(NULL, L"*****PRUEBA*****",-1,&rc,DT_CALCRECT,D3DXCOLOR(1.0f,0.0f,0.0f,1.0f));
g_pFont->DrawText(NULL, L"*****PRUEBA*****",-1,&rc,DT_CENTER,D3DXCOLOR(1.0f,0.0f,0.0f,1.0f));

g_pD3DDevice->EndScene();
g_pD3DDevice->SetRenderTarget(0, surface);


Ahora quiero que se combinen resultando el mensaje escrito en una de ellas en la otra, no puedo escribir sobre la que desearía porque no es rendertarget-compatible.

En el render:


 g_pD3DDevice->SetTexture(0, g_pMensajeTex);
 g_pD3DDevice->SetTexture(1, g_pImagenTex);
 

 g_pD3DDevice->SetRenderState( D3DRS_WRAP0, D3DWRAP_U | D3DWRAP_V );
 g_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
 g_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
 
 g_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE);
 g_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
 g_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT);
 g_pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
 g_pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);


El resultado es que una esfera con un color grisáceo bastante feo.  (nooo)

¿Como puedo conseguir el mensaje escrito correctamente?
Título: Combinar Dos Texturas
Publicado por: marcode en 10 de Marzo de 2006, 06:23:33 PM
 El alpha me parece que no tiene efecto en la multitextura más que para el siguiente paso al dibujar sobre el fondo de la pantalla. No estoy seguro pero creo que es así.

Prueba a poner fondo blanco a las letras si usas MODULATE, para que el color de la primera textura se multiplique por 1 con el fondo del texto, o si está el fondo negro usando ADD para que sume 0.

Título: Combinar Dos Texturas
Publicado por: marcode en 15 de Marzo de 2006, 10:43:21 PM
 Creo que la operación que buscas es D3DTOP_BLENDCURRENTALPHA.

Arg1 * Alpha + Arg2 *(1 - Alpha)

La primera textura lleva alpha=1 en las letras y  "no alpha"=0 en el fondo, por lo que según esa fórmula donde haya letras se dibujará la textura 1 y en el fondo la textura 2.

Si no va, echa un vistazo a los tipos de operaciones, que seguro que alguna sirve.

D3DTEXTUREOP

Y rectifico lo de que las operaciones con alpha no se tenían en cuenta en la multitextura. (nooo)  
Título: Combinar Dos Texturas
Publicado por: rrbenx en 16 de Marzo de 2006, 08:29:04 AM
 gracias por la respuesta, todavia no he tenido tiempo para probarlo a ver si esta tarde y comento los resultados.