原文地址:http://blog.csdn.net/xuguangsoft/article/details/8781256

原文标题:cocos2dx颜色混合

原文作者:镜子里的河妖

原文:

在游戏开发中,如果我们需要实现闪光的灯,照明弹效果等等,我么你可以采用混合模式来实现。

如果学习过OpenGL(ES),就知道里面使用glBlendFunc函数实现的。在cocos2d-x里肯定也有,对于精灵,可以使用mySprite->setBlendFunc()来现。


什么是颜色混合?

简单来说就是将RGBA中的A,经行操作处理具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。

OpenGL 会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜 色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨 论这个了)
假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs,Gs,Bs,As),目标颜色的四个分量是(Rd,Gd,Bd,Ad),又设源因子为(Sr,Sg,Sb,Sa),目标因子为(Dr,Dg,Db,Da)。则混合产生的新颜色可以表示为:

(Rs*Sr+Rd*Dr,Gs*Sg+Gd*Dg,Bs*Sb+Bd*Db,As*Sa+Ad*Da)

glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。
GL_ZERO:表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。
GL_ONE:表示使用1.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值来作为因子。


下面举一个例子:

[cpp] view plain copy
  1. ////////////////////////////
  2. //background
  3. CCSprite*helloSprite=CCSprite::create("man.png");
  4. helloSprite->setPosition(ccp(winSize.width/2,winSize.height/2));
  5. this->addChild(helloSprite);
  6. ////////////////////////////
  7. //addyoursprite
  8. CCSprite*lightSprite=CCSprite::create("light.png");
  9. lightSprite->setColor(ccwHITE);
  10. lightSprite->setScale(4.0f);
  11. lightSprite->setPosition(ccp(winSize.width/2,winSize.height/2+40));
  12. ccBlendFunccbl={GL_DST_COLOR,GL_ONE};
  13. lightSprite->setBlendFunc(cbl);
  14. this->addChild(lightSprite,2);
用到的light.png:-> <-(透明的)

看到,这个小人的光秃秃的头有种被照亮的感觉

使用颜色混合,加上动画,可以实现一些很酷的效果。


我的分享:

m_pMengBan = Sprite :: create("overlay_map.png");
	m_pMengBan->setAnchorPoint(Vec2::ZERO);
	m_pMengBan->setPosition(Vec2(GLB_SIZE.width,0));
	m_pMengBan->setopacity(120);
	pLayer->addChild(m_pMengBan,Z_Second);

	// 设置混合模式;
	BlendFunc cbl = {GL_DST_COLOR,GL_ONE_MINUS_SRC_ALPHA};
	m_pMengBan->setBlendFunc(cbl);

效果展示:


下面是举例讲解源颜色和目标颜色,摘自 http://www.cnblogs.com/yujunyong/archive/2011/04/13/2015467.html


如果设置了glBlendFunc(GL_ONE,GL_ZERO);,则表示完全使用源颜色,完全不使用目标颜色,因此画面效果和不使用混合的时候一致(当然效率可能会低一点点)。如果没有设置源因子和目标因子,则默认情况就是这样的设置。 如果设置了glBlendFunc(GL_ZERO,GL_ONE);,则表示完全不使用源颜色,因此无论你想画什么,最后都不会被画上去了。(但这并不是说这样设置就没有用,有些时候可能有特殊用途) 如 果设置了glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);,则表示源颜色乘以自身的alpha 值,目标颜色乘以1.0减去源颜色的alpha值,这样一来,源颜色的alpha值越大,则产生的新颜色中源颜色所占比例就越大,而目标颜色所占比例则减 小。这种情况下,我们可以简单的将源颜色的alpha值理解为“不透明度”。这也是混合时最常用的方式。 如果设置了glBlendFunc(GL_ONE,GL_ONE);,则表示完全使用源颜色和目标颜色,最终的颜色实际上就是两种颜色的简单相加。例如红色(1,0)和绿色(0,1,0)相加得到(1,0),结果为黄色。 注意: 所 谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则 红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕 。。

cocos2dx  混合模式的更多相关文章

  1. .net – 给定选择,混合模式程序集与单独的互操作DLL的优缺点是什么?

    当“混合模式组合”和“单独的互操作”版本提供第三方组件时,每个组件的优点和缺点是什么?混合模式组合似乎在我的项目中工作正常,没有GAC安装.很少有一个更少的DLL.感觉更整洁那么有什么缺点呢?

  2. ios – 使用Multiply混合模式覆盖UIImageViews?

    我有2个UIImageViews显示在彼此之上.其中一个可以使用手势识别器拖动.有没有一种方法可以使用像Multiply这样的混合模式渲染ImageViews?

  3. c# – 使用混合模式颜色在另一个图像上绘制图像

    在Photoshop中,您可以选择“颜色”将混合模式设置为下一个较低层:如果图像顶部只有一个渐变,结果可能如下所示:我在某处找到的颜色混合模式的描述是:颜色将下层的色调和饱和度改变为上层的色调和饱和度,但仅留下亮度.到目前为止我的代码是:但那是–当然–只是在较低的图像上绘画.所以问题是:如何使用Photoshop中提供的混合模式“颜色”在另一个图像上绘制图像?

  4. 混合模式程序集(C/C++LI项目)是否可以在.NET Core上运行?

    我有一个使用C/C++LI项目的代码库,它通过瘦包装类将C类暴露给CLR.例如…C项目中的C代码混合模式程序集中的C/C++LI代码据我所知,混合模式程序集几乎只能在Windows.NET上运行.我希望我不需要重新考虑组件并使用P/Invoke,这将为我提供跨平台支持.有谁知道.NETCore是否支持混合模式程序集?

  5. 如何在Cocos2D 1.0 中掩饰一个精灵(三)

    hopy;)尝试编译运行,在你每一次点击屏幕的时候,你将看到我可爱的妻子制作的随机日历图片:现在我们的app里已经有了像样的框架了,让我们开始实现掩饰效果吧!

  6. cocos2dx  混合模式

    如果学习过OpenGL,就知道里面使用glBlendFunc函数实现的。在cocos2d-x里肯定也有,对于精灵,可以使用mySprite->setBlendFunc()来现。下面举一个例子:[cpp]viewplaincopy//////////////////////////////backgroundCCSprite*helloSprite=CCSprite::create;helloSprite->setPosition;this->addChild;///////////////////////

  7. 制作新手引导高亮区域方法之一:混合模式

    demo下载:Quick-x-HighlightArea-master.zip1、混合模式(1)首先创建一个全屏的CCRenderTexture实例这里使用的黑色0.6的透明度,看起来的效果就是一层黑色半透明的遮罩叠在游戏界面上面:1234localpRt=CCRenderTexture:create(size.width,size.height)localcolor=ccc3(0,0)--黑色l

  8. cocos2d粒子系统--粒子编辑器Parti…

    CCParticleSystemQuad方形粒子系统,在3代以后的机器上运行的比较快,他会消耗更多的内存和cpu。使用预处理器ARCH_OPTIMAL_PARTICLE_SYstem来定义粒子系统,在代码编译过程中来判断使用哪一个粒子系统。会自动的根据机型选择合适的粒子系统例:@interfaceCCParticleExplosion:ARCH_OPTIMAL_PARTICLE_SYstem2、有关粒子贴图粒子贴图必须小于64x64的,越小越好。好了,下一步我们就来学习下粒子工具ParticleDesig

  9. APP三种开发模式--及---HybridApp解决方案_No1_混合模式(Hybrid)App开发概述

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  10. html5 – Chrome中的Chrome css3混合混合模式错误

    我有两个重叠的叠加层,叠加的部分使用混合混合模式混合.在chrome中应用了效果但是使用此属性的div有奇怪的闪烁.这是闪烁的原因以及如何解决.我已经在firefox上测试了它的良好运行但不是在chrome中.Screenshot上面的图像是一旦动画结束,一旦完成,左边的div开始连续闪烁.解决方法我有这个问题,发现它似乎是由混浊与混合混合模式的组合引起的.解决方案是添加一个将改变的规则:不透明度

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部