Unity3D - Shader - ShaderLab的混合命令

混合是如何实现的?

当片元着色器产生一个颜色时,可以选择与颜色缓存中的颜色进行混合。混合与两个操作数有关系:源颜色(Source Color)和目标颜色(Destination Color)。

  • 源颜色,用S表示,指的是片元着色器产生的颜色
  • 目标颜色,用D表示,指的是从颜色缓冲区中读取的颜色值。
  • 对他们进行混合后得到的输出颜色,用O表示,它会重写入到颜色缓冲中。

混合中的源颜色、目标颜色、输出颜色都包含RGBA四个通道的值。

混合等式

想要混合源颜色S和目标颜色D,得到输出颜色O需要使用混合等式(Blend Equation),而且每次混合需要两个等式,其中一个用于混合RGB通道,另一个用于混合Alhpa(A)通道。

由于需要两个等式混合(一个用于混合RGB通道,另一个用于混合Alpha通道),并且每个等式需要两个因子(一个用于和源颜色相乘,另一个用于和目标颜色相乘),所以一共有四个因子。

ShaderLab中设置混合因子的命令

命令描述
Blend SrcFactor DstFactor开启混合,并设置混合因子。 源颜色会乘以SrcFactor,而目标颜色会乘以DstFactor,然后把两者相加再存入颜色缓冲区中。
Blend SrcFactor DstFactor, SrcFactorA DstFactorA和上面一样,只是使用不同的因子来混合透明通道

在第一种情况下的命令,仅提供了两个因子,这意味着使用相同的混合因子来混合RGB通道和Alpha通道,即此时SrcFactorA等于SrcFactor,而DstFactorA等于DstFactor。

混合公式:注意结果是相加的

Orgb=SrcFactorSrgb+DstFactorDrgb

Oa=SrcFactorASa+DstFactorADa

可以作为混合因子的参数

参数描述
One因子为1
Zero因子为0
SrcColor因子为源颜色。当用于混合RGB的混合等式时,使用SrcColor的RGB分量作为混合因子;当用于混合Alpha的混合等式时,使用SrcColor的A分量作为混合因子
SrcAlpha因子源颜色的透明度值(Alpha通道)
DstColor因子为源颜色值。当用于混合RGB通道的混合等式时,使用DstColor的RGB分量作为混合因子;当用于混合Alpha通道的混合等式时,使用DstColor分量作为混合因子。
DstAlpha因子为目标颜色的透明度值(Alpha通道)

混合操作

混合等式中,当把源颜色和目标颜色与它们对应的混合因子相乘后,还可以使用Add/Sub/RevSub/Min/Max等操作。

操作描述
Add将混合后的源颜色和目的颜色相加。默认的混合操作
Orgb=SrcFactorSrgb+DstFactorDrgb Oa=SrcFactorASa+DstFactorADa
Sub用混合后的源颜色减去混合后的目的颜色。
Orgb=SrcFactorSrgbDstFactorDrgb Oa=SrcFactorASaDstFactorADa
RevSub用混合后的目的颜色减去混合后的源颜色。
Orgb=DstFactorDrgbSrcFactorSrgb Oa=DstFactorADaSrcFactorASa
Min使用源颜色和目的颜色中的较小值,是逐分量比较。
Orgba=(min(Sr,Dr),min(Sg,Dg),min(Sb,Db),min(Sa,Da))
Max使用源颜色和目的颜色中的较大值,是逐分量比较。
Orgba=(max(Sr,Dr),max(Sg,Dg),min(Sb,Db),max(Sa,Da))

常见的混合类型


Blend SrcAlpha OneMinusSrcAlpha, One Zero

// 正常(Normal), 即透明度混合
Blend SrcAlpha OneMinusSrcAlpha

// 柔和相加 Soft Additive
Blend OneMinusDstColor One

// 正片叠底(Multiply) 相乘
Blend DstColor One

// 两倍相乘(2x Multiply)
Blend DstColor SrcColor

// 变暗 Darken
BlendOp Min
Blend One One

// 变亮 Lighten
BlendOp Max
Blend One One

// 滤色
Blend OneMinusDstColor One

// 线性减淡
Blend One One
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值