cocos2dx中的颜色混合

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

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

             [Sprite setBlendFunc:(ccBlendFunc){GL_ONE,GL_ZERO} ];

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

        源的RGBA变量:RsGsBsAs

        目标的RGBA  RdGdBdAd

        源的各个运算因子:  N_RsN_GsN_BsN_As

        目标的各个运算因子:   N_RdN_GdN_BdN_Ad

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

                                Bs*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值作为因子


常数 相关因子 融合因子结果
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)


以上均为转载,出自http://blog.sina.com.cn/s/blog_7a2ffd5c0100xtid.html

以下为测试的组合效果


代码:

//融合  taget和source都在播放动画,且建立时无添加图片,以下效果均在动画中看到的效果
void mixedSprites(CCSprite* taget, CCSprite* source)
{
    CCRenderTexture* pRT = CCRenderTexture::create(480,320);
    pRT->setPosition(Point(240,160));

    ccBlendFunc func1 = {GL_ZERO, GL_SRC_ALPHA};
    ccBlendFunc func2 = {GL_DST_ALPHA, GL_ZERO};
    
    taget->setBlendFunc(func1);
    source->setBlendFunc(func2);

    

    pRT->begin();
    taget->visit();
    source->visit();
    pRT->end();
}


//func1 修改后的组合效果  

ccBlendFunc func1 = {GL_ZERO, GL_ZERO};  taget 变成一个黑色矩形

ccBlendFunc func1 = {GL_ZERO, GL_ONE};   taget 消失

ccBlendFunc func1 = {GL_ZERO, GL_DST_COLOR};   taget 原图片透明,变成高亮区域

ccBlendFunc func1 = {GL_ZERO, GL_SRC_COLOR};  taget 原先透明部分黑色填充

ccBlendFunc func1 = {GL_ZERO, GL_ONE_MINUS_DST_COLOR};  taget  原图不见,成一个模糊矩形

ccBlendFunc func1 = {GL_ZERO, GL_ONE_MINUS_SRC_COLOR};  浮雕样式

ccBlendFunc func1 = {GL_ZERO, GL_SRC_ALPHA};  原图被扣去成透明,原先透明部分黑色填充

ccBlendFunc func1 = {GL_ZERO, GL_ONE_MINUS_SRC_ALPHA};  原图变黑色,原透明部分不变。就像灯光下的影子

ccBlendFunc func1 = {GL_ZERO, GL_DST_ALPHA};  没有图片

ccBlendFunc func1 = {GL_ZERO, GL_ONE_MINUS_DST_ALPHA};  变成一个黑色矩形

ccBlendFunc func1 = {GL_ZERO, GL_SRC_ALPHA_SATURATE};  同上


ccBlendFunc func1 = {GL_ONE, GL_SRC_ALPHA_SATURATE};   原先透明部分黑色填充

ccBlendFunc func1 = {GL_ONE, GL_ONE_MINUS_DST_ALPHA};  同上

ccBlendFunc func1 = {GL_ONE, GL_DST_ALPHA};  原图被蒙上一层白色

ccBlendFunc func1 = {GL_ONE, GL_ONE_MINUS_SRC_ALPHA};  图片周边出现毛刺,被羽化

ccBlendFunc func1 = {GL_ONE, GL_SRC_ALPHA};  原图被蒙上一层白色,透明部分黑色填充

ccBlendFunc func1 = {GL_ONE, GL_ONE_MINUS_SRC_COLOR};  呈半透明,类似飘出的灵魂

ccBlendFunc func1 = {GL_ONE, GL_ONE_MINUS_DST_COLOR};  原先透明部分黑色填充,之后又全部被蒙上一层颜色

ccBlendFunc func1 = {GL_ONE, GL_SRC_COLOR};  原先透明部分黑色填充

ccBlendFunc func1 = {GL_ONE, GL_DST_COLOR};  图片成半透明,显示在一个高亮区域

ccBlendFunc func1 = {GL_ONE, GL_ONE};   呈半透明,类似飘出的灵魂

ccBlendFunc func1 = {GL_ONE, GL_ZERO};  原先透明部分黑色填充


ccBlendFunc func1 = {GL_DST_COLOR, GL_ZERO};  原先透明部分黑色填充,图形成半透明

ccBlendFunc func1 = {GL_DST_COLOR, GL_ONE};   呈半透明,类似飘出的灵魂

ccBlendFunc func1 = {GL_DST_COLOR, GL_DST_COLOR};  图片成半透明,显示在一个高亮区域

ccBlendFunc func1 = {GL_DST_COLOR, GL_SRC_COLOR};  原先透明部分黑色填充

ccBlendFunc func1 = {GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR};  原先透明部分黑色填充,之后又全部被蒙上一层颜色

ccBlendFunc func1 = {GL_DST_COLOR, GL_ONE_MINUS_SRC_COLOR};  图片消失

ccBlendFunc func1 = {GL_DST_COLOR, GL_SRC_ALPHA};   原图成半透明,底色成黑色

ccBlendFunc func1 = {GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA}; 颜色变暗

ccBlendFunc func1 = {GL_DST_COLOR, GL_DST_ALPHA};  呈半透明,类似飘出的灵魂

ccBlendFunc func1 = {GL_DST_COLOR, GL_ONE_MINUS_DST_ALPHA};底色黑色

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值