Blend混合效果

349 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

所谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体,则绿色是源颜色,红色是目标颜色。

src:当前要绘制的, dest:上次绘制的结果

在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。

以sprite作为src,sprite所在位置的其他像素作为dest,进行混合运算

参数\颜色RGBA
RsGsBsAs
源的运算因子N_RsN_GsN_BsN_As
目标RdGdBdAd
目标的运算因子N_RdN_GdN_BdN_Ad
混合后的值Rs * N_Rs + Rd * N_RdGs * N_Gs + Gd * N_GdBs * N_Bs + Bd * N_BdAs * N_As + Ad * N_Ad

运算因子:

变量
GL_ONE1.0
GL_ZERO0.0
GL_SRC_ALPHA源Alpha作为因子
GL_DST_ALPHA目标Alpha作为因子
GL_ONE_MINUS_SRC_ALPHA1.0减去源的Alpha值作为因子
GL_ONE_MINUS_DST_ALPHA1.0减去目标的Alpha值作为因子
  • creator默认的是:
GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA

举例:

原图如下:

blend(GL_ONE, GL_ZERO)的效果:

Source(rgba)*1+Dest(rgba)*0

如果Sprite本身有透明的地方,则透明的地方会变成黑色。因为此时不显示目标的颜色。即使透明度为0也没有意义。

blend(GL_ZERO, GL_ONE)的效果:

Source(rgba)*0+Dest(rgba)*1

表示不使用源颜色,那么该Sprite便不被画出来。

blend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

  • 表示源颜色乘以自身的alpha值,目标颜色乘以1.0减去源颜色的alpha值
  • 这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减小。
  • 这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”,这也是混合时最常用的方式。

blend(GL_ONE, GL_ONE)

  • 最终的颜色实际上就是两种颜色的简单相加。
  • 例如红色(1, 0, 0)和绿色(0, 1, 0)相加得到(1, 1, 0),结果为黄色。

blend(GL_SRC_ALPHA, GL_ONE)

  • 表示把渲染的图像叠加到目标区域,也就是说源的每一个像素的alpha都等于自己的alpha,目标的每一个像素的alpha等于1。
  • 这样叠加次数越多,叠加的图元的alpha越高,得到的结果就越亮。
  • 因此这种融合用于表达光亮效果。

blend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

  • 表示把渲染的图像融合到目标区域。也就是说源的每一个像素的alpha都等于自己的alpha,目标的每一个像素的alpha等于1减去该位置源像素的alpha。
  • 因此不论叠加多少次,亮度是不变的。

使用ALPHA相关的因子,会根据透明度来计算。

blend(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)

targetAlpha = SourceAlpha*1 + DestAlpha*(1-SourceAlpha)

SourceAlpha=0.1
DestAlpha=1
targetAlpha = 0.1*1 + 1*0.9=1
SourceAlpha=0.9
DestAlpha=0.1
targetAlpha = 0.9*1 + 0.1*0.1 =0.91
SourceAlpha=0
DestAlpha=1
targetAlpha = 0*1 + 1*1 = 1
常数相关因子融合因子结果
GL_ZERO源因子或目的因子(0,0,0,0)
GL_ONE源因子或目的因子(1,1,1,1)
GL_DST_COLOR源因子(Rd,Gd,Bd,Ad)
GL_SRC_COLOR目的因子(Rs,Gs,Bs,As)
GL_ONE_MINUS_DST_COLOR源因子(1,1,1,1)-(Rd,Gd,Bd,Ad)
GL_ONE_MINUS_SRC_COLOR目的因子(1,1,1,1)-(Rs,Gs,Bs,As)
GL_SRC_ALPHA源因子或目的因子(As,As,As,As)
GL_ONE_MINUS_SRC_ALPHA源因子或目的因子(1,1,1,1)-(As,As,As,As)
GL_DST_ALPHA源因子或目的因子(Ad,Ad,Ad,Ad)
GL_ONE_MINUS_DST_ALPHA源因子或目的因子(1,1,1,1)-(Ad,Ad,Ad,Ad)
GL_SRC_ALPHA_SATURATE源因子(f,f,f,1); f=min(As,1-Ad)