Blend 混合

之前遇到过几次需要修改Blend的情况,但是当时没有仔细了解。现在总结一下

假设:颜色信息的四个分量(红,绿,蓝,透明度)

    (1)“源颜色”  :(Rs, Gs, Bs, As)

    (2)“目标颜色”:(Rd, Gd, Bd, Ad)

    (3)“源因子”  :(Sr, Sg, Sb, Sa)

    (4)“目标因子”:(Dr, Dg, Db, Da)

指定混合运算符为 “ADD”

那么混合产生的新颜色可以表示为:

    (Rs*Sr + Rd*Dr , Gs*Sg + Gd*Dg , Bs*Sb + Bd*Db , As*Sa + Ad*Da)
混合方式 解释 因子值
ZERO 全部不用 (0 , 0 , 0 , 0)
ONE 全部使用 (1 , 1 , 1 , 1)
SRC_COLOR 使用源颜色 (Rs , Gs , Bs , As)
DST_COLOR 使用目标颜色 (Rd , Gd , Bd , Ad)
ONE_MINUS_SRC_COLOR 减去源颜色 (1-Rs , 1-Gs , 1-Bs , 1-As)
ONE_MINUS_DST_COLOR 减去目标颜色 (1-Rd , 1-Gd , 1-Bd , 1-Ad)
SRC_ALPHA 使用源颜色的透明度 (As , As , As , As)
DST_ALPHA 使用目标颜色的透明度 (Ad , Ad , Ad , Ad)
ONE_MINUS_SRC_ALPHA 减去源颜色的透明度 (1-As , 1-As , 1-As , 1-As)
ONE_MINUS_DST_ALPHA 减去目标颜色的透明度 (1-Ad , 1-Ad , 1-Ad , 1-Ad)
混合运算符 解释 操作
ADD 两个颜色相加 A+B
SUB 两个颜色相减 A-B
REV_SUB 两个颜色对换相减 B-A
MIN 两个颜色最小值 min(A,B)
MAX 两个颜色最大值 max(A,B)

现在在场景里拖入一个红色方块和蓝色方块,


要修改蓝色的混合方式,所以新建了一个材质
蓝色作为目标颜色,在他之前的渲染的作为原颜色
可以计算一下叠加区域的颜色

默认情况

Cocos默认的是一下的混合方式


R = 0x1 +255x(1-1)
G = 0x1 + 0x(1-1)
B = 255x1 + 0x(1-1)

Alpha的值计算同理
这种情况下观察的话其实和原因子ONE,目标因子ZERO效果一样

把目标因子改为SCR_ALPHA

R = 0*1 +255*(1-0)
G = 0*1 + 0*(1-0)
B = 255*1 + 0*(1-0)

叠加颜色
screenshot-20230509-164342
和直接修改颜色的值效果一致

2赞

mark!我之前都是凭感觉调的 :joy:

还是得凭感觉调

凭感觉调对了,凭实力调歪了

1赞

实力量子力学