US3S3L3——设置混合命令
US3S3L3——设置混合命令
混合
在进行渲染状态的混合相关设置中,我们的步骤为:
- 进行混合操作的设置(非必须,默认为 
Add ) - 进行混合方式的设置(主要设置混合因子)
 
常见的混合类型包括:透明度混合、柔性相加、正片叠底、两倍相乘、变暗、变亮、滤色、线性减淡
混合的基本原理
当我们在进行渲染时,当片元通过了深度测试后,会进入到混合流程中。
在混合流程中:
- 当前片元的颜色被称为 源颜色
 - 颜色缓冲区中的颜色被称为 目标颜色
 
混合 就是将 源颜色 和 目标颜色 用对应的混合算法进行计算后
输出一个新的颜色 更新到颜色缓冲区中
注意:这些颜色都是 RGBA,包含透明通道A
混合方式
我们之前在学习 SubShader 语法时学过,
在编写Shader时可以通过添加 混合方式 Blend 的渲染状态
来控制 源颜色 和 目标颜色 如何进行混合计算
以正常透明混合为例:
1  | Pass  | 
混合默认是关闭的,当我们在使用了 Blend 混合命令时(除 Blend off),Unity内部就会自动的帮助我们开启混合
我们在实现透明效果时,需要设置混合方式这个渲染状态
混合的计算规则
我们假设
- 当前片元的颜色被称为
 - 颜色缓冲区中的颜色被称为
 - 混合后的
 
混合计算的规则就是需要构建两个混合等式:
- 
计算 RGB 通道的混合等式
 - 
计算 A 通道的混合等式
 
从渲染状态上体现,如下段代码所示,包括两种写法:
1  | Pass  | 
如果我们使用方式二来设置因子,由于没有指定透明相关因子,因此,在计算时:
- 源透明因子 = 源因子
 - 目标透明因子 = 目标因子
 
混合计算的混合等式为
- 
计算 RGB 通道的混合等式
 - 
计算 A 通道的混合等式
 
混合因子
在 Unity 当中 ShaderLab 为我们提供了很多设定好的混合因子,我们根据需求直接使用即可
| 混合因子 | 描述 | 
|---|---|
One | 
因子为 1 | 
Zero | 
因子为 0 | 
SrcColor | 
因子为源颜色值,混合RGB时用它的RGB作因子;混合A时用它的A | 
SrcAlpha | 
因子为源颜色的透明度值(A通道) | 
DstColor | 
因子为目标颜色值,混合RGB时用它的RGB作因子;混合A时用它的A | 
DstAlpha | 
因子为目标颜色的透明度值(A通道) | 
OneMinusSrcColor | 
因子为 ,混合RGB时用它的RGB作因子;混合A时用它的A | 
OneMinusSrcAlpha | 
因子为 (A通道) | 
OneMinusDstColor | 
因子为 ,混合RGB时用它的RGB作因子;混合A时用它的A | 
OneMinusDstAlpha | 
因子为 (A通道) | 
以下面两个渲染状态为例:
1  | Pass  | 
根据上面的混合计算公式,得到该渲染状态的混合计算公式为:
1  | Pass  | 
根据上面的混合计算公式,得到该渲染状态的混合计算公式为:
混合操作
刚才学习的混合计算规则当中,都是使用对应混合因子和源颜色与目标颜色相乘后再相加。
其实 Unity 当中还可以选择其他的计算方式来进行混合计算
在 ShaderLab 当中除了可以使用 Blend 混合命令来设定混合因子
还提供了一个 BlendOp 混合操作命令来设定混合的计算方式,它的基本语法是:
1  | Pass  | 
| 混合操作 | 描述 | 
|---|---|
Add(默认操作) | 
用混合后的源颜色和目标颜色相加   | 
Sub | 
用混合后的源颜色和目标颜色相减   | 
RevSub | 
用混合后的目标颜色减去混合后的源颜色 | 
Min | 
使用源颜色和目标颜色中较小的值(逐分量比较,无需和因子计算) | 
Max | 
使用源颜色和目标颜色中较大的值(逐分量比较,无需和因子计算) | 
| 其他混合操作 | 无法全平台支持,部分仅支持 Windows DX11 及以上,部分仅支持高版本 OpenGL 所有混合操作及其支持平台,详见:ShaderLab 命令:BlendOp - Unity 手册  | 
常见混合类型
- 
透明度混合(Normal)
1
Blend SrcAlpha OneMinusSrcAlpha

 - 
柔和相加(Soft Additive)
1
Blend OneMinusSrcColor One

 - 
正片叠底(Multiply),相当于源和目标相乘
1
Blend DstColor Zero

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

 - 
变暗(Darken)
1
2BlendOp Min
Blend One One
 - 
变亮(Lighten)
1
2BlendOp Max
Blend One One
 - 
滤色(Screen)
1
Blend OneMinusDstColor One
相当于
1
Blend One OneMinusSrcColor

 - 
线性减淡(Linear Dodge)
1
Blend One One

 
