Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Degiik en 05 de Marzo de 2007, 11:34:11 PM

Título: Blending con Dx9
Publicado por: Degiik en 05 de Marzo de 2007, 11:34:11 PM
Hola os expongo mi problema.

Dispongo de una textura A con todos los pixeles del siguiente color:

RGBA ( 0.8 , 0.6, 0.4, 1.0 )

y de la textura B con los pixeles:

RGBA ( 0.6, 0.4, 0.2, 0.5 )

Renderizando primero A (back) y después B (front), y usando:

IDirect3DDevice9::SetRenderState (D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)
IDirect3DDevice9::SetRenderState (D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)

/*
D3DBLEND_SRCALPHA
   Blend factor is (As, As, As, As).
D3DBLEND_INVSRCALPHA
   Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As).
*/

el pixel resultante del blending es:

RGBA ( )

Formula:

OutputPixel = (SrcPixel x ScrBlendMode) + (DstPixel x DstBlendMode)  

OutputPixel  = RGBA ( 0.8 * 0.5, 0.6 * 0.5, 0.4 * 0.5, 1.0 *  0.5) + RGBA ( 0.6 * (1 - 0.5), 0.4 * (1 - 0.5), 0.2 * (1 - 0.5), 0.5 * (1 - 0.5))

OutputPixel  = RGBA ( 0.4, 0.3, 0.2, 0.5) + RGBA ( 0.3, 0.2, 0.1, 0.25 )

OutputPixel  = RGBA ( 0.7, 0.5, 0.3, 0.75)

( corregirme si me he equivocado )

Como puedo hacer para que entre los componentes RGB se calcule el blending, pero sobre la componente A quede con el valor del DstPixel ?

Es decir:

OutputPixel  = RGBA ( 0.7, 0.5, 0.3, 1.0)
Título: Blending con Dx9
Publicado por: senior wapo en 06 de Marzo de 2007, 01:49:24 AM
Googlea SetTextureStageState y juega con los parametros TB_COLOR_OP en D3DTOP_MODULATE y TB_ALPHA_OP en D3DTOP_SELECTARG1 o similares.
Título: Blending con Dx9
Publicado por: marcode en 06 de Marzo de 2007, 10:23:22 AM
creo que se puede hacer con D3DRS_SEPARATEALPHABLENDENABLE, pero nunca lo he probado y no sé que tarjetas lo soportan.

Mírate los últimos "render state types" enumerados
http://msdn2.microsoft.com/en-us/library/bb172599.aspx
Título: Blending con Dx9
Publicado por: Degiik en 06 de Marzo de 2007, 05:45:02 PM
Cita de: "marcode"creo que se puede hacer con D3DRS_SEPARATEALPHABLENDENABLE, pero nunca lo he probado y no sé que tarjetas lo soportan.

Mírate los últimos "render state types" enumerados
http://msdn2.microsoft.com/en-us/library/bb172599.aspx

Que grande !!!
Antes de poner el post pensaba como últmo recurso un PixelShader. Pero ahora tengo justo lo que necesitaba, tratar el Alpha por separado.

SEPARATEALPHABLENDENABLE me funciona en una 7600gt lo digo por si alguien lo quiere tener como referencia.

Gracias por las respuestas.  
:wink: