Shader山下(十八)混合(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较大值(逐个通道比较)

注:还有其他一些混合操作,但是目前只有DX11.1支持


混合因子(Blend)

One混合因子1,表示完全的源颜色或目标颜色
Zero混合因子0,舍弃掉源颜色或目标颜色
SrcColor源颜色值
SrcAlpha源透明度
DstColor目标颜色值
DstAlpha目标透明度
OneMinusSrcColor1-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 // 两倍相乘

当然,相乘/正片叠底的混合命令写成:

Blend Zero SrcColor

也是合情合理合法的。


最后,我们还可以扩展一下:

参考百度百科滤色,我们知道,滤色的公式是:

结果色=255-[(255-基色)×(255-混合色)]/255

对应于[0,1]范围内也就是

FinalColor=1-(1-Dst)*(1-Src)

也就是

Dst+Src-Dst*Src

也就是

Src*1+Dst*(1-Src)

或者

Src*(1-Dst)+Dst*1

所以滤色的混合命令我们可以写成下面两种:

Blend OneMinusDstColor One
Blend One OneMinusSrcColor



  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值