我已經想通了這一點,並賦予它不是我在其他地方看到在互聯網上,我希望這會幫助別人......
對於第一個混合式,爲四邊形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