Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





¿Alpha blending + blend factor?

Iniciado por fiero, 13 de Mayo de 2007, 12:29:43 AM

« anterior - próximo »

fiero

Hola!

Estoy haciendo una funcion para dibujar imagenes en 2D con DX9 y no sé como hacer un blending con transparencia. O sea, tengo una imagen con canal alfa, la imagen tiene una zonas totalmente transparentes y otras semitransparentes en los bordes de la figura, para el efecto antializasing. Para mostrar la imagen uso:

m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

El caso es que quiero aplicar a la imagen un factor alpha (a toda la imagen). En mi motor software (sin DX) lo que hago es multiplicar el factor alfa (un valor de 0 a 255) por el valor del canal alfa de cada pixel, con lo cual, consigo una imagen semitransparente pero con antialiasing en los bordes. Para hacer esta transparencia con DX9 (pero no se usará el canal alpha de la textura):

m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true);
m_pd3dDevice->SetRenderState( D3DRS_BLENDFACTOR,alfa);
m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_BLENDFACTOR);
m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVBLENDFACTOR);

Pero, ¿como junto las dos cosas? Solo puedo usar el factor alfa cuando uso alpha testing en vez de blending, con esto:

m_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, true);
m_pd3dDevice->SetRenderState( D3DRS_ALPHAREF, (DWORD)0x0000001 );
m_pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );

pero claro, los bordes de la figura dentro de la imagen quedan abruptos.

He intentado hacer cosas con SetTextureStageState pero no consigo nada. Lo que habría que hacer es decirle a la tarjeta que multiplique cada valor del canal alpha de la textura por un factor. ¿Alguna manera de hacer esto sin usar shaders?

un saludo
www.videopanoramas.com Videopanoramas 3D player

senior wapo

Usa la primera forma (las 3 primeras lineas de codigo) y pon el color de los 4 vertices a blanco con alpha deseado. El color a usar es siempre el de la textura multiplicado por el color de los vertices interpolado en ese punto (si no has tocado nada mas).

fiero

Gracias senior wapo!!!

Estuve un rato probando y solo conseguía cambiar el color del polígono, no el alfa. Hasta que he descubierto que hay que definir un render stage para multiplicar los dos alfas, el de la textura y el diffuse del vertice:

m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);

saludos
www.videopanoramas.com Videopanoramas 3D player






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.