控制新绘制像素(源/Source)与已有像素(目标/Destination)的颜色叠加方式。
声明混合
在SubShader/Pass中声明
- 混合操作符:
BlendOp [操作符]
BlendOp [RGB操作符] [Alpha操作符] // 分离RGB/A
- 混合因子
Blend [源因子] [目标因子]
Blend [RGB源因子] [RGB目标因子], [Alpha源因子] [Alpha目标因子] // 分离RGB/A
分离RGB/A:需要针对Alpha通道使用不同的混合因子进行混合时,前半部分是RGB,后半是Alpha
警告
注意!
分离RGB/A的方式,如果是直接输出到屏幕的颜色缓冲区,是无法生效的,因为目标Alpha永远是1。可以使用一个独立的RT相机,将混合后的颜色输出到RT中,此时的Alpha便是可写入的。
- 示例:
Blend One Zero // Color = 1 * 源色 + 0 * 目标色
Blend DstColor Zero // Color = 目标色 * 源色 + 0 * 目标色 (相当于正片叠底)
混合公式
FinalColor = (SrcFactor * SrcColor) 操作符 (DstFactor * DstColor)
SrcColor:当前片元着色器输出的颜色(源)DstColor:帧缓存中已存在的颜色(目标)SrcFactor,DstFactor:混合因子(权重系数)操作符:通常为+(默认),可改为-、min、max
混合因子关键词
| 因子关键字 | 对应值 (RGBA) |
|---|---|
One |
(1,1,1,1) |
Zero |
(0,0,0,0) |
SrcColor |
源颜色值 (R_src, G_src, B_src, A_src) |
SrcAlpha |
源透明度 (A_src, A_src, A_src, A_src) |
DstColor |
目标颜色值 (R_dst, G_dst, B_dst, A_dst) |
DstAlpha |
目标透明度 (A_dst, A_dst, A_dst, A_dst) |
OneMinusSrcColor |
一减源颜色值(1 - R_src, 1 - G_src, 1 - B_src, 1 - A_src) |
OneMinusDstColor |
一减目标颜色值(1 - R_dst, 1 - G_dst, 1 - B_dst, 1 - A_dst) |
OneMinusSrcAlpha |
一减源透明度(1 - A_src, ...) |
常用混合模式预设
混合操作符均为Add(默认)
| 混合模式 | Blend命令 | 效果描述 | 典型应用 |
|---|---|---|---|
| 正常透明 (Alpha Blending) | Blend SrcAlpha OneMinusSrcAlpha |
标准透明度混合 | 玻璃、烟雾、UI透明度 |
| 加法叠加 (Additive) | Blend One One |
颜色亮度叠加,会变亮 | 火焰、光晕、粒子特效 |
| 软加法 (Soft Additive) | Blend OneMinusDstColor One |
避免过度曝光,柔和增亮 | 灯光效果 |
| 乘法叠加 (Multiplicative) | Blend DstColor Zero |
保留目标色,源颜色作为滤镜 | 阴影、染色效果 |
| 正片叠底 (Multiply) | Blend DstColor SrcColor |
源与目标相乘,变暗效果 | 投影、暗角 |
| 屏幕叠加 (Screen) | Blend One OneMinusSrcColor |
类似Photoshop屏幕模式,提亮 | 高光、眩光 |
混合操作符
| 操作符 | 计算公式 | 效果说明 |
|---|---|---|
Add (默认) |
Final = Src + Dst |
源与目标颜色相加(标准叠加) |
Sub |
Final = Src - Dst |
源颜色减去目标颜色 |
RevSub |
Final = Dst - Src |
目标颜色减去源颜色 |
Min |
Final = min(Src, Dst) |
取各通道最小值(变暗效果) |
Max |
Final = max(Src, Dst) |
取各通道最大值(变亮效果) |
Mul |
Final = Src * Dst |
源与目标相乘(类似乘法混合) |
Screen |
Final = 1 - (1 - Src) * (1 - Dst) |
类似屏幕叠加模式 |