语法
Blend Off | 关闭混合(这是默认值) |
Blend SrcFactor DstFactor | 配置并启用混合。生成的颜色将乘以 SrcFactor。屏幕上的已有颜色乘以 DstFactor,然后将这两个值相加。 |
Blend SrcFactor DstFactor, SrcFactorA DstFactorA | 同上,但使用不同系数来混合 Alpha 通道。 |
BlendOp Op | 不将混合颜色相加,而是对它们执行不同的操作。 |
BlendOp OpColor, OpAlpha | 同上,但是对颜色 (RGB) 通道和 Alpha (A) 通道使用不同的混合操作。 |
如果开启混合,默认的混合运算(没有使用BlendOp Op或BlendOp OpColor, OpAlpha)是两个值相加的,即:BlendOp Add。
当 使用多渲染目标 (MRT) 渲染时,上面的常规语法 将为所有渲染目标设置相同的混合模式。以下语法可以为各个渲染目标设置不同的混合模式,其中 N 是渲染目标索引(0 到 7)。此功能适用于大多数现代 API/GPU(DX11/12、GLCore、Metal 和 PS4):
Blend N SrcFactor DstFactor
Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
BlendOp N Op
BlendOp N OpColor, OpAlpha
混合运算
Add | 将源和目标相加。 |
Sub | 从源减去目标。 |
RevSub | 从目标减去源。 |
Min | 使用源和目标中的较小者。 |
Max | 使用源和目标中的较大者。 |
LogicalClear | 逻辑运算:清除 (0) 仅限 DX11.1。 |
LogicalSet | 逻辑运算:设置 (1) 仅限 DX11.1。 |
LogicalCopy | 逻辑运算:复制 (s) 仅限 DX11.1。 |
LogicalCopyInverted | 逻辑运算:逆复制 (!s) 仅限 DX11.1。 |
LogicalNoop | 逻辑运算:空操作 (d) 仅限 DX11.1。 |
LogicalInvert | 逻辑运算:逆运算 (!d) 仅限 DX11.1。 |
LogicalAnd | 逻辑运算:与 (s & d) 仅限 DX11.1。 |
LogicalNand | 逻辑运算:与非 !(s & d) 仅限 DX11.1。 |
LogicalOr | Logical operation Or (s 、d) DX11.1 only. |
LogicalNor | Logical operation: Nor !(s 、d) DX11.1 only. |
LogicalXor | 逻辑运算:异或 (s ^ d) 仅限 DX11.1。 |
LogicalEquiv | 逻辑运算:相等 !(s ^ d) 仅限 DX11.1。 |
LogicalAndReverse | 逻辑运算:反转与 (s & !d) 仅限 DX11.1。 |
LogicalAndInverted | 逻辑运算:逆与 (s & d) 仅限 DX11.1。 |
LogicalOrReverse | Logical operation: Reverse Or (s |
LogicalOrInverted | Logical operation: Inverted Or (!s |
混合系数
以下所有属性对 Blend 命令中的 SrcFactor 和 DstFactor 都有效。源是指计算所得颜色,目标是指屏幕上已有的颜色。如果 BlendOp 在使用逻辑运算,则将忽略混合系数。
One | 值为 1 - 让源或目标颜色通过。 |
Zero | 值为 0 - 删除源或目标值。 |
SrcColor | 此阶段的值乘以源颜色值。 |
SrcAlpha | 此阶段的值乘以源 Alpha 值。 |
DstColor | 此阶段的值乘以帧缓冲区源颜色值。 |
DstAlpha | 此阶段的值乘以帧缓冲区源 Alpha 值。 |
OneMinusSrcColor | 此阶段的值乘以(1 - 源颜色)。 |
OneMinusSrcAlpha | 此阶段的值乘以(1 - 源 Alpha)。 |
OneMinusDstColor | 此阶段的值乘以(1 - 目标颜色)。 |
OneMinusDstAlpha | 此阶段的值乘以(1 - 目标 Alpha)。 |
以下是比较常见的混合类型:
Blend SrcAlpha OneMinusSrcAlpha // 传统透明度
Blend One OneMinusSrcAlpha // 预乘透明度
Blend One One // 加法
Blend OneMinusDstColor One // 软加法
Blend DstColor Zero // 乘法
Blend DstColor SrcColor // 2x 乘法
示例
按照下图:
如果shader使用了 Blend SrcAlpha OneMinusSrcAlpha
Blend SrcAlpha OneMinusSrcAlpha
因为没有指定 BlendOp 所以默认为 BlendOp Add
则屏幕最终的颜色是:
outColor = RmGmBmAm * SrcAlpha + RsGsBsAs * OneMinusSrcAlpha = RmGmBmAm * Am + RsGsBsAs * (1 - Am)
如果指定了 BlendOp为BlendOp Sub,即
Blend SrcAlpha OneMinusSrcAlpha
BlendOp Sub
则屏幕最终的颜色是:
outColor = RmGmBmAm * SrcAlpha - RsGsBsAs * OneMinusSrcAlpha = RmGmBmAm * Am - RsGsBsAs * (1 - Am)