Jump to content

  • Log In with Google      Sign In   
  • Create Account


Alpha Blending


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 brekehan   Members   -  Reputation: 101

Like
0Likes
Like

Posted 17 May 2009 - 07:15 PM

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]

Sponsor:

#2 MJP   Moderators   -  Reputation: 10280

Like
0Likes
Like

Posted 17 May 2009 - 07:47 PM

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.





#3 brekehan   Members   -  Reputation: 101

Like
0Likes
Like

Posted 17 May 2009 - 07:58 PM

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;
};

#4 Adam_42   Crossbones+   -  Reputation: 2381

Like
0Likes
Like

Posted 17 May 2009 - 11:12 PM

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.

#5 brekehan   Members   -  Reputation: 101

Like
0Likes
Like

Posted 17 May 2009 - 11:43 PM

k thanx :)




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS