Jump to content
  • Advertisement
Sign in to follow this  
brekehan

Alpha Blending

This topic is 3415 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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]

Share this post


Link to post
Share on other sites
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.



Share this post


Link to post
Share on other sites
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;
};

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!