cocos2d-x 颜色混合
2014-06-10 11:52
337 查看
在游戏开发中,如果我们需要实现闪光的灯,照明弹效果等等,我么你可以采用混合模式来实现。
如果学习过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
plaincopy
////////////////////////////
// background
CCSprite *helloSprite = CCSprite::create("man.png");
helloSprite->setPosition(ccp(winSize.width/2, winSize.height/2));
this->addChild(helloSprite);
////////////////////////////
// add your sprite
CCSprite *lightSprite = CCSprite::create("light.png");
lightSprite->setColor(ccWHITE);
lightSprite->setScale(4.0f);
lightSprite->setPosition(ccp(winSize.width/2, winSize.height/2+40));
ccBlendFunc cbl = {GL_DST_COLOR, GL_ONE};
lightSprite->setBlendFunc(cbl);
this->addChild(lightSprite, 2);
用到的light.png:->
<-(透明的)
看到,这个小人的光秃秃的头有种被照亮的感觉
使用颜色混合,加上动画,可以实现一些很酷的效果。
如果学习过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
plaincopy
////////////////////////////
// background
CCSprite *helloSprite = CCSprite::create("man.png");
helloSprite->setPosition(ccp(winSize.width/2, winSize.height/2));
this->addChild(helloSprite);
////////////////////////////
// add your sprite
CCSprite *lightSprite = CCSprite::create("light.png");
lightSprite->setColor(ccWHITE);
lightSprite->setScale(4.0f);
lightSprite->setPosition(ccp(winSize.width/2, winSize.height/2+40));
ccBlendFunc cbl = {GL_DST_COLOR, GL_ONE};
lightSprite->setBlendFunc(cbl);
this->addChild(lightSprite, 2);
用到的light.png:->
<-(透明的)
看到,这个小人的光秃秃的头有种被照亮的感觉
使用颜色混合,加上动画,可以实现一些很酷的效果。
相关文章推荐
- 【cocos2d-x 2.x 学习与应用总结】14: 自定义shader绘制混合颜色的矩形
- Cocos2d中使用颜色混合:加算,减算
- Cocos2d中使用颜色混合:加算,减算
- Cocos2d中使用颜色混合:加算,减算
- cocos2d 颜色混合 ccBlendFunc 使用方法
- Cocos2d-x v3.X的颜色混合BlendFunc使用详解
- Cocos2d-x v3.X的颜色混合BlendFunc使用详解
- Cocos2d中使用颜色混合:加算,减算
- cocos2d-x 颜色混合
- cocos2d-x颜色混合模式完成光照效果
- cocos2d-x-3.2 不能混合颜色修改
- Cocos2d-x v3.3的颜色混合BlendFunc
- cocos2d-x颜色混合模式完成光照效果
- cocos2d-x 颜色混合
- cocos2d-x 颜色混合
- cocos2d-x 颜色混合
- Cocos2d-x3.3的的颜色混合BlendFunc
- Cocos2d-x v3.X的颜色混合BlendFunc使用详解
- 【OpenCV入门教程之五】 分离颜色通道&多通道图像混合
- 【OpenCV入门教程之五】 分离颜色通道&多通道图像混合