我已经想通了这一点,并赋予它不是我在其他地方看到在互联网上,我希望这会帮助别人......
对于第一个混合式,为四边形Q渲染与T :
Q - >Ť
color = src * srcAlpha + dst * (1 - srcAlpha)
alpha = 1 * srcAlpha + (1 - srcAlpha) * destAlpha
对于第二共混物方程,T将在屏幕:
笔 - >取值
color = src * 1 + dst * (1 - srcAlpha)
alpha = doesn't matter as screen alpha isn't used
说明
对于化合物Q - > T,对于彩色分量的方程式是按正常阿尔法混合方程:
color = src * srcAlpha + dst * (1 - srcAlpha)
但是我们需要确保alpha通道是为第二部分设立的。因为我们使用这个混合等式有效地将Q的alpha值预渲染到T上,所以我们只需要第二阶段的alpha就可以确定在渲染T的时候屏幕颜色的暗淡程度,因此Alpha所述第一等式为:
alpha = 1 * srcAlpha + (1 - srcAlpha) * destAlpha
但我们只用它来褪色T在第二方程中的颜色后面的目标颜色(我们使用1 SRC颜色因为这是由式(1)预相乘):
color = src * 1 + dst * (1 - srcAlpha)
在DirectX 11中,无论使用方程式1直接渲染到屏幕还是使用两个方程渲染t然后是屏幕。
代码DirectX 11的(谁喜欢真正的代码的人):
一号公式:
D3D11_BLEND_DESC blend{};
blend.AlphaToCoverageEnable = FALSE;
auto& target = blend.RenderTarget[0];
target.BlendEnable = TRUE;
target.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
target.SrcBlend = D3D11_BLEND_SRC_ALPHA;
target.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
target.BlendOp = D3D11_BLEND_OP_ADD;
target.SrcBlendAlpha = D3D11_BLEND_ONE;
target.DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
target.BlendOpAlpha = D3D11_BLEND_OP_ADD;
第二个公式:
D3D11_BLEND_DESC blend{};
blend.AlphaToCoverageEnable = FALSE;
auto& target = blend.RenderTarget[0];
target.BlendEnable = TRUE;
target.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
target.SrcBlend = D3D11_BLEND_ONE;
target.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
target.BlendOp = D3D11_BLEND_OP_ADD;
target.SrcBlendAlpha = D3D11_BLEND_ZERO;
target.DestBlendAlpha = D3D11_BLEND_ONE;
target.BlendOpAlpha = D3D11_BLEND_OP_ADD;
T为初始清零{0,0 ,0,0}。
对不起,我已经纠正了我的问题零应该是一个。 – keith