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

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

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

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

源的RGBA变量:Rs,Gs,Bs,As;

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

源的各个运算因子:  N_Rs,N_Gs,N_Bs,N_As;

目标的各个运算因子:   N_Rd,N_Gd,N_Bd,N_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:1.0

GL_ZERO:0.0

GL_SRC_ALPHA:源的Alpha值作为因子

GL_DST_ALPHA:目标Alpha作为因子

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

GL_ ONE_MINUS_DST_ALPHA:1.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};底色黑色

ccBlendFunc func1 = {GL_DST_COLOR, GL_SRC_ALPHA_SATURATE}; 底色黑色,颜色变暗


ccBlendFunc func1 = {GL_SRC_COLOR, GL_SRC_ALPHA_SATURATE}; 底色黑色,对比度变高

ccBlendFunc func1 = {GL_SRC_COLOR, GL_ONE_MINUS_DST_ALPHA};同上

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

ccBlendFunc func1 = {GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA};对比度变高

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

ccBlendFunc func1 = {GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR}; 隐身效果

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

ccBlendFunc func1 = {GL_SRC_COLOR, GL_SRC_COLOR}; 底色黑色,对比度变高

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

ccBlendFunc func1 = {GL_SRC_COLOR, GL_ONE}; 隐身效果

ccBlendFunc func1 = {GL_SRC_COLOR, GL_ZERO};底色黑色,对比度变高


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

ccBlendFunc func1 = {GL_ONE_MINUS_DST_COLOR, GL_ONE}; 隐身效果

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

ccBlendFunc func1 = {GL_ONE_MINUS_DST_COLOR, GL_SRC_COLOR};底色黑色

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

ccBlendFunc func1 = {GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR};浮雕加隐身效果

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

ccBlendFunc func1 = {GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA};颜色加深

ccBlendFunc func1 = {GL_ONE_MINUS_DST_COLOR, GL_DST_ALPHA};隐身效果

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


感觉人都傻了。不要问我为什么不会问,我只想说一个字“艹”


ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA_SATURATE};底色黑色, 图片变糊

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_DST_ALPHA};同上

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_DST_ALPHA};隐身效果,图片糊了

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA};颜色变暗,图片变糊

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_SRC_ALPHA};原图成半透明,底色成黑色, 图片变糊

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR};透明,加油画风格

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

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_SRC_COLOR};底色成黑色, 图片变糊

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

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_ONE};隐身效果,图片糊了

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_COLOR, GL_ZERO};底色成黑色,之后又全部被蒙上一层颜色,图片变糊


求大仙指点迷津,带小人脱离这个凡尘


ccBlendFunc func1 = {GL_SRC_ALPHA, GL_ZERO};底色成黑色

ccBlendFunc func1 = {GL_SRC_ALPHA, GL_ONE};隐身效果

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

ccBlendFunc func1 = {GL_SRC_ALPHA, GL_SRC_COLOR};底色成黑色,亮度高

ccBlendFunc func1 = {GL_SRC_ALPHA, GL_ONE_MINUS_DST_COLOR};底色成黑色,之后又全部被蒙上一层颜色

ccBlendFunc func1 = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR};隐身效果

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

ccBlendFunc func1 = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA};原图

ccBlendFunc func1 = {GL_SRC_ALPHA, GL_DST_ALPHA};隐身效果

ccBlendFunc func1 = {GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA};底色成黑色

ccBlendFunc func1 = {GL_SRC_ALPHA, GL_SRC_ALPHA_SATURATE};底色成黑色


ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA_SATURATE};黑底,只显示图片轮廓

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA};同上

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA};只有图片轮廓,有点白色像粉笔画

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA};人物全黑,像灯光下影子

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA};黑底,原先图片处透明

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR};浮雕

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_COLOR};只有图片轮廓,有点白色像粉笔画,再被蒙上一层颜色

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_SRC_COLOR};黑底加羽化

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_DST_COLOR};白色描边显示在高亮区域

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_ONE};白色描边

ccBlendFunc func1 = {GL_ONE_MINUS_SRC_ALPHA, GL_ZERO};黑底,白色描边


ccBlendFunc func1 = {GL_DST_ALPHA, GL_ZERO};黑底

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

ccBlendFunc func1 = {GL_DST_ALPHA, GL_DST_COLOR};半透明,显示在高亮区域

ccBlendFunc func1 = {GL_DST_ALPHA, GL_SRC_COLOR};黑底,亮度提高

ccBlendFunc func1 = {GL_DST_ALPHA, GL_ONE_MINUS_DST_COLOR};黑底,亮度提高,再蒙上一层

ccBlendFunc func1 = {GL_DST_ALPHA, GL_SRC_COLOR};黑底,亮度提高

ccBlendFunc func1 = {GL_DST_ALPHA, GL_ONE_MINUS_DST_COLOR};黑底,亮度提高,再蒙上一层

ccBlendFunc func1 = {GL_DST_ALPHA, GL_ONE_MINUS_SRC_COLOR};隐身效果

ccBlendFunc func1 = {GL_DST_ALPHA, GL_SRC_ALPHA};黑底,蒙上一层白色

ccBlendFunc func1 = {GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA};羽化

ccBlendFunc func1 = {GL_DST_ALPHA, GL_DST_ALPHA};隐身效果

ccBlendFunc func1 = {GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA};黑底

ccBlendFunc func1 = {GL_DST_ALPHA, GL_SRC_ALPHA_SATURATE};同上


ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA_SATURATE};黑色矩形

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA};同上

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA};消失

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA};图片变黑

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA};黑底,图片变透明

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_COLOR};浮雕

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_DST_COLOR};黑色矩形

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_SRC_COLOR};黑底,亮度变暗

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_DST_COLOR};高亮框,无图

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_ONE};消失

ccBlendFunc func1 = {GL_ONE_MINUS_DST_ALPHA, GL_ZERO};;黑色矩形


ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_ZERO};黑色矩形

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_ONE};消失

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_DST_COLOR};高亮框,无图

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_SRC_COLOR};黑底,亮度变暗

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_ONE_MINUS_DST_COLOR};黑色矩形

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_ONE_MINUS_SRC_COLOR};浮雕

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_SRC_ALPHA};图片变透明,留黑底

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_ONE_MINUS_SRC_ALPHA};人物全黑,像灯光下影子

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_DST_ALPHA};消失

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_ONE_MINUS_DST_ALPHA};黑色矩形

ccBlendFunc func1 = {GL_SRC_ALPHA_SATURATE, GL_SRC_ALPHA_SATURATE};同上


终于结束了。

没文化很可怕,没智商更可怕。以上就是很好的例子。



cocos2dx中的颜色混合相关推荐

  1. Cocos2d-X中实现菜单特效

    Cocos2d-X中能够讲菜单和动作结合起来使用实现菜单特效 程序实例1:使用菜单和动作的组合实现菜单特效<一> #include "MenuItem.h"CCScen ...

  2. cocos2d-x中的curl

    将请求的接口的动作放在互斥锁中进行 1: 2: 3: pthread_mutex_t mutex; 4: pthread_t thread; 5: sem_t * m_structSem; 6: 7: ...

  3. Cocos2d-x中的坐标系

    绘图坐标系:它是最常见的坐标系,与OpenGL采用的坐标系相同,以左下角为原点,向右为X轴正方向,向上为Y轴正方向.在Cocos2d-x中,一切绘图相关的操作都使用绘图坐标系,如游戏元素中的Posit ...

  4. 【cocostudio】发布资源在Cocos2d-x中如何使用

    http://cn.cocos2d-x.org/tutorial/show?id=1945 1. 新版本的加载方式: 使用Cocos Studio 2.0发布的CSB资源更换了加载方式,需要用CSLo ...

  5. 深入cocos2d-x中的touch事件

    深入cocos2d-x中的touch事件 在文章cocos2d-x中处理touch事件中简单讨论过怎样处理touch事件, 那么今天来深入了解下cocos2d-x中是怎样分发touch事件的. 我们最 ...

  6. Cocos2d中使用颜色混合:加算,减算

    Cocos2d中使用颜色混合:加算,减算 转自http://blog.sina.com.cn/s/blog_7a2ffd5c0100xtid.html CCSprite有一个ccBlendFunc类型 ...

  7. cocos2d-x中几种存储数据的方式

    说明:本文所论述内容均基于cocos2dx 3.0 版本. 1.UserDefault 它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 查看CCUserDefault文件,可以 ...

  8. 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池

    2019独角兽企业重金招聘Python工程师标准>>> #深入Cocos2d-x-探索Cocos2d-x中的内存管理-引用计数和自动释放池 ###引用计数(Reference Cou ...

  9. 跟着石头哥哥学cocos2d-x(四)--cocos2dx中的动画以及TexturePacker使用

    2019独角兽企业重金招聘Python工程师标准>>> 之前向Andreas Loew申请了一枚TexturePacker注册码,很快都下来了,作为回报我打算还是写一篇关于Textu ...

最新文章

  1. 反对人工智能的九条意见是什么?
  2. html元素li移动动态效果
  3. java groovyshell_在java中使用groovy怎么搞
  4. WebAPI(part8)--节点操作
  5. codeforces 919E Congruence Equation
  6. C# 图像模板匹配并标注
  7. 【转】C#命名空间与java包的区别分析
  8. 3月起这些新规将实施:从事网络招聘服务应取得许可证
  9. 送你几款数据可视化大屏项目,科技感爆棚!!
  10. 2018.12.26 作业
  11. Go语言中使用panic和recover简化错误处理
  12. dto与java bean_POJO、JavaBean、DTO的区别
  13. 解决用wps另存dbf格式文件,丢失只转换了部分数据
  14. linux-mount-iso
  15. 数据传输 | 利用 DTLE 将 MySQL 数据同步到 DBLE
  16. 想要穷游北京?这些湖光山色的地方人少还景美!
  17. 在企业中应用的区块链应能够扩容以满足业务条线的需求
  18. 激光SLAM 前端数据预处理--剔除坏点方法总结
  19. 那些年啊,那些事——一个程序员的奋斗史 ——14
  20. 【UE4从零开始 015】蓝图简介

热门文章

  1. PHP免费发短信飞信类实现
  2. 雅思词汇之万词plan:第1-365天
  3. 我们的征途是星辰大海(演讲稿)(作者:黄哲威)
  4. ABP VNext学习日记2
  5. [DFS/递推/DP] 2327 [SCOI2005] 扫雷 ( 普及+/提高
  6. GGS ERROR 160 Bad column index
  7. 【Java】函数式编程学习笔记——Stream流
  8. Android 7再带壁纸,Android7 添加壁纸系统或替换系统壁纸
  9. Java面试题(六)腾讯Spring夺命7连问(灵魂拷问)
  10. 笔记整理-MySQL高级