CCSprite有一个ccBlendFunc类型的blendFunc_结构体成员,可以用来设置描绘时的颜色混合方案。ccBlendFunc包含了一个src和一个dst,分别表示目标和源的运算因子。

   如果我们对一个Sprite使用setBlendFunc方法,如:

           

   会以这个Sprite作为源,Sprite所在位置的其它像素作为目标,进行混合运算:

      

       目标的RGBA:  Rd,Gd,Bd,Ad;

       源的各个运算因子: 

       目标的各个运算因子:  

混合后的RGBA为:(Rs*N_Rs+ Rd* N_Rd,Gs*N_Gs+ Gd* N_Gd,

                               Bs*N_Bs+ Bd* N_Bd,As*N_As+ Ad* N_Ad)

 

       

       

       

       

        GL_ONE_MINUS_SRC_ALPHA:1.0减去源的Alpha值作为因子

       


   我们可以在CCSprite的init方法中看到,默认的状态下使用GL_ONE,GL_ONE_MINUS_SRC_ALPHA这两个参数,这也是我们看到的情况,Sprite会覆盖下面的描绘,但如果有透明的地方,则会显示下面的色值。让我们看一下说使用各个参数的效果:

    0:不改变混合,使用默认的情况:
    

Cocos2dx 之 setBlendFunc_系统

   1:如果设置glBlendFunc(GL_ONE,GL_ZERO), 表面完全使用源颜色,即和不混合一样的效果,但是如果Sprite本身有透明的地方,则透明的地方会变成黑色。因为此时不显示目标的颜色。即使透明度为0也没有意义。

Cocos2dx 之 setBlendFunc_系统_02

   2:如果设置glBlendFunc(GL_ZERO, GL_ONE),表示不使用源颜色,那么该Sprite便不被画出来。

 

Cocos2dx 之 setBlendFunc_系统_03

   3:使用ALPHA相关的因子,会根据透明度来计算,比如透明度高的颜色占较大比重等。如默认情况。

附:

常数

相关因子

融合因子结果

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)