Cocos2d-x v3.X的顏色混合BlendFunc使用詳解(轉載)
1、概念詳解
“顏色混合”是指兩種顏色的疊加,在新圖片渲染到螢幕上的時候,將根據新圖片的紅、綠、藍和透明度值與已載入螢幕上的圖片顏色資訊重新融合。
1)源顏色:新圖片成為源顏色
2)目標顏色:螢幕上已存在顏色稱為目標顏色
3)源因子:OpenGL會把源顏色和目標顏色各自取出,並乘以一個係數,源顏色乘以的係數稱為源因子
4)目標因子:目標顏色乘以的係數成為目標因子。二者相加,即得到一個新的顏色。
2、計算公式
假設:顏色資訊的四個分量入下:(紅、綠、藍、透明度)
1)源顏色: (Rs,Gs,Bs,As)
2)目標顏色:(Rd,Gd,Bd,Ad)
3)源因子: (Sr,Sg,Sb,Sa)
4)目標因子: (Dr,Dg,Db,Da)
則顏色的組合如下:(Rs*Sr+Rd+Dr,Gs*Sg+Gd+Dg,Bs*Sb+Bd*Db,As*Sa+Ad*Da)如果顏色某一分量超過1.0,自動擷取。
3、計算因子
4、使用方法
Sprite精靈類中存在一個設定混合方式的函式:setBlendFunc(BlendFunc),另外混合方式的屬性值是以BlendFunc結構體作為數的,定義方式為:{‘源因子’,’目標因子’},混合方式可用於精靈圖片顏色資訊的混合與疊加。
1)建立混合方式
BlendFunc cbl = {GL_SRC_ALPHA,GL_ONE};
2)靜態常量(常用混合方式)
constBlendFunc BlendFunc:ISABLE = {GL_ONE, GL_ZERO};
constBlendFunc BlendFunc::ALPHA_PREMULTIPLIED = {GL_ONE, GL_ONE_MINUS_SRC_ALPHA};
constBlendFunc BlendFunc::ALPHA_NON_PREMULTIPLIED = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA};
constBlendFunc BlendFunc::ADDITIVE = {GL_SRC_ALPHA, GL_ONE};
3)混合方式舉例
//目標圖片,已存在於螢幕上
Sprite* sp1 = Sprite::create(“red.jpg”);
sp1->setPosition(mysize/3);
this->addChild(sp1);
//源圖片,新圖片
Sprite* sp2 = Sprite::create(“green.jpg”);
sp2->setPosition(mysize/3.0*2.0);
this->addChild(sp2);
//混合方式,新圖片渲染時的混合方式
//{ 源因子 , 混合因子 }
BlendFunc cbl = { GL_SRC_ALPHA , GL_ONE };
sp2->setBlendFunc(cbl);
//
4)測試
可對下面的組合進行測試
(1){GL_ONE,GL_ZERO}:效果:重疊部分綠色蓋住紅色
(2){GL_ZERO,GL_ONE}:效果:綠色消失
(3){GL_ONE,GL_ONE}:效果:顏色融合
(4){GL_SRC_ALPHA,GL_ONE}:比較常用,源顏色的透明度影響融合顏色