我已经弄清楚了,鉴于这不是我在互联网上其他地方看到的东西,我希望这对其他人有所帮助......
对于第一个混合方程,将四边形 Q 渲染到 T:
问 -> T
color = src * srcAlpha + dst * (1 - srcAlpha)
alpha = 1 * srcAlpha + (1 - srcAlpha) * destAlpha
对于第二个混合方程,T 进入屏幕:
T -> S
color = src * 1 + dst * (1 - srcAlpha)
alpha = doesn't matter as screen alpha isn't used
说明
对于 Q -> T,颜色分量的方程是按照正常的 alpha 混合方程:
color = src * srcAlpha + dst * (1 - srcAlpha)
但是,我们需要确保为第二部分设置了 Alpha 通道。因为我们使用这个混合方程在渲染到 T 时有效地预乘了 Q 的 alpha,所以我们只需要第二阶段的 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}。