原文地址:http://blog.csdn.net/xuguangsoft/article/details/8781256
原文标题:cocos2dx颜色混合
原文:
@H_404_7@
在游戏开发中,如果我们需要实现闪光的灯,照明弹效果等等,我么你可以采用混合模式来实现。@H_404_7@
如果学习过OpenGL(ES),就知道里面使用glBlendFunc函数实现的。在cocos2d-x里肯定也有,对于精灵,可以使用mySprite->setBlendFunc()来现。@H_404_7@
@H_404_7@
什么是颜色混合?@H_404_7@
简单来说就是将RGBA中的A,经行操作处理@H_404_7@。@H_404_7@具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。@H_404_7@@H_404_7@@H_404_7@
OpenGL 会把源颜色和目标颜色各自取出,并乘以一个系数(源颜色乘以的系数称为“源因子”,目标颜色乘以的系数称为“目标因子”),然后相加,这样就得到了新的颜 色。(也可以不是相加,新版本的OpenGL可以设置运算方式,包括加、减、取两者中较大的、取两者中较小的、逻辑运算等,但我们这里为了简单起见,不讨 论这个了)
假设源颜色的四个分量(指红色,绿色,蓝色,alpha值)是(Rs,Gs,Bs,As),目标颜色的四个分量是(Rd,Gd,Bd,Ad),又设源因子为(Sr,Sg,Sb,Sa),目标因子为(Dr,Dg,Db,Da)。则混合产生的新颜色可以表示为:@H_404_7@@H_404_7@@H_404_7@
(Rs*Sr+Rd*Dr,Gs*Sg+Gd*Dg,Bs*Sb+Bd*Db,As*Sa+Ad*Da)
@H_404_7@@H_404_7@@H_404_7@
glBlendFunc有两个参数,前者表示源因子,后者表示目标因子。这两个参数可以是多种值,下面介绍比较常用的几种。@H_404_7@
GL_ZERO:表示使用0.0作为因子,实际上相当于不使用这种颜色参与混合运算。@H_404_7@
GL_ONE:表示使用1.0作为因子,实际上相当于完全的使用了这种颜色参与混合运算。@H_404_7@
GL_SRC_ALPHA:表示使用源颜色的alpha值来作为因子。@H_404_7@
GL_DST_ALPHA:表示使用目标颜色的alpha值来作为因子。@H_404_7@
GL_ONE_MINUS_SRC_ALPHA:表示用1.0减去源颜色的alpha值来作为因子。@H_404_7@
GL_ONE_MINUS_DST_ALPHA:表示用1.0减去目标颜色的alpha值来作为因子。@H_404_7@@H_404_7@
下面举一个例子:@H_404_7@
- ////////////////////////////@H_404_7@@H_404_7@@H_404_7@
- //background@H_404_7@@H_404_7@@H_404_7@
- CCSprite*helloSprite=CCSprite::create("man.png"@H_404_7@);@H_404_7@@H_404_7@
- helloSprite->setPosition(ccp(winSize.width/2,winSize.height/2));@H_404_7@
- this@H_404_7@->addChild(helloSprite);@H_404_7@@H_404_7@
- @H_404_7@
- ////////////////////////////@H_404_7@@H_404_7@@H_404_7@
- //addyoursprite@H_404_7@@H_404_7@@H_404_7@
- CCSprite*lightSprite=CCSprite::create("light.png"@H_404_7@);@H_404_7@@H_404_7@
- lightSprite->setColor(ccWHITE);@H_404_7@
- lightSprite->setScale(4.0f);@H_404_7@
- lightSprite->setPosition(ccp(winSize.width/2,winSize.height/2+40));@H_404_7@
- ccBlendFunccbl={GL_DST_COLOR,GL_ONE};@H_404_7@
- lightSprite->setBlendFunc(cbl);@H_404_7@
- this@H_404_7@->addChild(lightSprite,2);@H_404_7@@H_404_7@
看到,这个小人的光秃秃的头有种被照亮的感觉@H_404_7@
使用颜色混合,加上动画,可以实现一些很酷的效果。@H_404_7@
我的分享:
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),结果为黄色。 注意: 所 谓源颜色和目标颜色,是跟绘制的顺序有关的。假如先绘制了一个红色的物体,再在其上绘制绿色的物体。则绿色是源颜色,红色是目标颜色。如果顺序反过来,则 红色就是源颜色,绿色才是目标颜色。在绘制时,应该注意顺序,使得绘制的源颜色与设置的源因子对应,目标颜色与设置的目标因子对应。不要被混乱的顺序搞晕 。。