Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Combinar Dos Texturas

Iniciado por rrbenx, 09 de Marzo de 2006, 07:23:15 PM

« anterior - próximo »

rrbenx

 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?
Tap or Die Juego Android Gratis!!
Dungeon break Juego Android Gratis!!
Organic Software
Blog

marcode

 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.

size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

marcode

 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)  
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

rrbenx

 gracias por la respuesta, todavia no he tenido tiempo para probarlo a ver si esta tarde y comento los resultados.
Tap or Die Juego Android Gratis!!
Dungeon break Juego Android Gratis!!
Organic Software
Blog






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.