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)
Googlea SetTextureStageState y juega con los parametros TB_COLOR_OP en D3DTOP_MODULATE y TB_ALPHA_OP en D3DTOP_SELECTARG1 o similares.
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
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: