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