Blend混合命令
当同时存在透明物体和不透明物体,首先渲染不透明物体,将不透明物体颜色写入颜色缓存,深度写入深度缓冲,然后渲染透明物体(关闭深度写入,开启深度测试),将透明物体的颜色与颜色缓冲中的颜色混合,得到正确结果。
UnityShaderLab提供了相应的Blend混合命令,用于指定后渲染产生的颜色如何与颜色缓存中的颜色进行混合。混合命令由Blend关键字,操作和因子组成,操作默认是加操作,下面给出 Blend 的常用语义:
Blend Off
关闭混合
Blend SrcFactor DstFactor
开启混合,SrcFactor 和 DstFactor 为混合因子(其实就是个系数),S是源颜色,D是目的颜色,混合后的颜色Color如下,其rgb和a值都使用同一套混合因子:
Blend SrcFacter DstFactor, SrcFactorA DstFactorA
同上,不过额外指定了透明通道的混合因子:
支持的一些混合因子:
参数 | 描述 |
---|---|
Zero | Blend factor is (0, 0, 0, 0). |
One | Blend factor is (1, 1, 1, 1). |
DstColor | Blend factor is (Rd, Gd, Bd, Ad). |
SrcColor | Blend factor is (Rs, Gs, Bs, As). |
OneMinusDstColor | Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad). |
SrcAlpha | Blend factor is (As, As, As, As) |
OneMinusSrcColor | Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As). |
DstAlpha | Blend factor is (Ad, Ad, Ad, Ad). |
OneMinusDstAlpha | Blend factor is (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad). |
SrcAlphaSaturate | Blend factor is (f, f, f, 1); where f = min(As, 1 - Ad). |
OneMinusSrcAlpha | Blend factor is (1 - As, 1 - As, 1 - As, 1 - As). |
几种常见的混合类型:
//正常(Normal)
Blend SrcAlpha OneMinusSrcAlpha
//柔和相加(Soft Addtive)
Blend OneMinusDstAlpha One
//正片叠底(Multiply),即相乘
Blend DstColor Zero
//两倍相乘(2x Multiply)
Blend DstColor SrcColor
//变暗(Darken)
BlendOp Min
Blend One One
//变亮(Lighten)
BlendOp Max
Blend One One
//滤色(Screen)
Blend OneMinusDstColor One
//线性减淡(Linear Dodge)
Blend One One