混合(Blend)命令
混合(Blend)被用于创建透明的对象。渲染图像时,当所有的着色器执行完并且所有的纹理都被应用之后,像素点会被写入屏幕。如何将这些像素与已有图像进行组合?我们就需要使用混合命令来告诉GPU混合的方式。
混合命令有以下这些:
Blend Off
关闭混合(默认)
Blend SrcFactor DstFactor
片元产生的颜色乘以SrcFactor,加上屏幕上已有的颜色乘以DstFactor,
得到最终的颜色(写入颜色缓存)
Blend SrcFactor DstFactor, SrcFactorA DstFactorA
同上,只不过使用单独的因子SrcFactorA和DstFactorA来混合透明度通道
BlendOp BlendOperation
用其他的操作来取代加法混合。
BlendOp OpColor, OpAlpha
同上,只不过对于透明度通道使用不同的操作。
注:此外还有AlphaToMask On命令,用来开启alpha-to-coverage,如果有机会我们会在后续文章中介绍。
混合操作(BlendOp):
Add
加法:
FinalColor=SrcFactor*SrcColor+DstFactor*DstColor
Sub
减法(源-目标):
FinalColor=SrcFactor*SrcColor-DstFactor*DstColor
RevSub
减法(目标-源):
FinalColor=DstFactor*DstColor-SrcFactor*SrcColor
Min
较小值(逐个通道比较)
Max
较大值(逐个通道比较)
混合因子(Blend)
One
混合因子1,表示完全的源颜色或目标颜色
Zero
混合因子0,舍弃掉源颜色或目标颜色
SrcColor
源颜色值
SrcAlpha
源透明度
DstColor
目标颜色值
DstAlpha
目标透明度
OneMinusSrcColor
1-SrcColor
OneMinusSrcAlpha
1-SrcAlpha
OneMinusDstColor
1-DstColor
OneMinusDstAlpha
1-DstAlpha
常用的混合命令有:
Blend SrcAlpha OneMinusSrcAlpha // 传统透明度
Blend One OneMinusSrcAlpha // 预乘透明度
Blend One One // 叠加Blend OneMinusDstColor One // 柔和叠加
Blend DstColor Zero // 相乘——正片叠底
Blend DstColor SrcColor // 两倍相乘