Alpha Blending

Started by
3 comments, last by brekehan 14 years, 11 months ago
I have the following blend state in my shader BlendState SrcAlphaBlendAdd { BlendEnable[0] = TRUE; SrcBlend = SRC_ALPHA; DestBlend = ONE; BlendOp = ADD; SrcBlendAlpha = ZERO; DestBlendAlpha = ZERO; BlendOpAlpha = ADD; RenderTargetWriteMask[0] = 0x0F; }; Now, even though the image being rendered has an alpha of 1 throughout. It still looks tinted blue (which is the clear color) I see the formula is (src blend factor * src_alpha) + (dest_blend factor * dst_alpha) If I plug in numbers: white * 1 + blue * 1 That isn't what I want. Also, I assume directx is normalizing the color since the above would be higher than pure white? If the src alpha is 1, I want it to totally cover up anything behind it. What state can I use? Can I do it without turning alpha blending completely off? Also, what are the SrcBlendAlpha and DesBlendAlpha values that are set to ZERO, if SrcBlend and DestBlend are the blend factors in the above mentioned formula? EDIT: Bah, MSDN makes it look like SrcBlend and SrcBlendAlpha are the same thing, I don't understand. [Edited by - brekehan on May 18, 2009 1:36:40 AM]
Advertisement
Those render states represent this formula:

result.rgb = (output.rgb * output.a) + (destination.rgb * 1);result.a = (output.a * 0) + (destination.a * 0);


So it works like this: SrcBlend and DestBlend specify what value you multiply with the source RGB and the destination RGB before applying the blending operation...SRC_ALPHA means you multiply by source RGB by the source alpha, and ONE means you're multiplying destination RGB by 1. Then since your BlendOp is add, you add the two products. Since you're multiplying the destination by 1, this means that the destination color will always be present in your final result (even when the incoming alpha is 1). Typically what's used for DestBlend is INV_SRC_ALPHA. This means that when incoming alpha is 1.0 you multiply the destination by 0 (so it's not present in the final result at all).

As for SrcBlendAlpha and DestBlendAlpha, those control how you calculate the final result for only the alpha channel (SrcBlend and DestBlend only affect the RGB channels) that gets stored in the render target. Typically you set both of these to ONE, so that you accumulate opacity.



Quote:Original post by MJP
Those render states represent this formula:

result.rgb = (output.rgb * output.a) + (destination.rgb * 1);result.a = (output.a * 0) + (destination.a * 0);


So it works like this: SrcBlend and DestBlend specify what value you multiply with the source RGB and the destination RGB before applying the blending operation...SRC_ALPHA means you multiply by source RGB by the source alpha, and ONE means you're multiplying destination RGB by 1. Then since your BlendOp is add, you add the two products. Since you're multiplying the destination by 1, this means that the destination color will always be present in your final result (even when the incoming alpha is 1). Typically what's used for DestBlend is INV_SRC_ALPHA. This means that when incoming alpha is 1.0 you multiply the destination by 0 (so it's not present in the final result at all).

As for SrcBlendAlpha and DestBlendAlpha, those control how you calculate the final result for only the alpha channel (SrcBlend and DestBlend only affect the RGB channels) that gets stored in the render target. Typically you set both of these to ONE, so that you accumulate opacity.


Ok I think I'm getting it.
Is it OK to have RGB values greater than 1.0, 1.0, 1.0 as a result?
And is it OK to have Alpha values greater than 1.0 as a result?

I think this is what I need to do, but am unsure of the AlphaBlendOp adding 1 and 1:

BlendState SrcAlphaBlend
{
BlendEnable[0] = TRUE;
SrcBlend = SRC_ALPHA;
DestBlend = INV_SRC_ALPHA;
BlendOp = ADD;
SrcBlendAlpha = ONE;
DestBlendAlpha = ONE;
BlendOpAlpha = ADD;
RenderTargetWriteMask[0] = 0x0F;
};
All values greater than 1.0 will be clamped to 1.0 (unless you're using a floating point render target). Same goes for values less than 0.0.
k thanx :)

This topic is closed to new replies.

Advertisement