一、概念
「混合」是指兩種顏色的疊加方式。在新將要渲染畫到螢幕上的時候,將用在新中的紅、綠、藍和透明度資訊,與螢幕上已經存在的顏色資訊相融合。
說的具體一點,就是把某一畫素位置上原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。
新顏色被稱作「源顏色」,而螢幕上已存在的顏色則被稱作「目標顏色」。
opengl會把源顏色和目標顏色各自取出,並乘以乙個係數(源顏色乘以的係數稱為「源因子」,目標顏色乘以的係數稱為「目標因子」),然後相加,這樣就得到了新的顏色。
二、計算公式
假設:顏色資訊的四個分量(紅,綠,藍,透明度)
(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,則它會被自動擷取為1.0,不需要考慮越界的問題。
三、混合因子
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值來作為因子。
四、使用方法
sprite精靈類中有乙個設定混合方式的函式setblendfunc(blendfunc),另外混合方式的屬性值是以blendfunc結構體作為資料的,定義方式為:。
混合方式可用於精靈紋理顏色資訊的混合與疊加。
看一下cocos2d-x中blendfunc的定義,其中有兩個成員src和dst,並定義了幾種預設的混合方式。
struct cc_dll blendfunc
static const blendfunc disable;
//! blending enabled for textures with alpha premultiplied. uses
static const blendfunc alpha_premultiplied;
//! blending enabled for textures with alpha non premultiplied. uses
static const blendfunc alpha_non_premultiplied;
//! enables additive blending. uses
static const blendfunc additive;
bool operator==(const blendfunc &a) const
bool operator!=(const blendfunc &a) const
bool operator
};
**測試如下:
//test 1
sprite* sp1 = sprite::create("my_test/red.png");
sp1->setposition(vec2(200, 200));
addchild(sp1);
sprite* sp2 = sprite::create("my_test/green.png");
sp2->setposition(vec2(220,220));
this->addchild(sp2);
blendfunc cbl = ;
sp2->setblendfunc(cbl);
//test 2
sprite* sp3 = sprite::create("my_test/red.png");
sp3->setposition(vec2(300, 200));
addchild(sp3);
sprite* sp4 = sprite::create("my_test/green.png");
sp4->setposition(vec2(320,220));
this->addchild(sp4);
blendfunc cb2 = ;
sp4->setblendfunc(cb2);
//test 3
sprite* sp5 = sprite::create("my_test/red.png");
sp5->setposition(vec2(400, 200));
addchild(sp5);
sprite* sp6 = sprite::create("my_test/green.png");
sp6->setposition(vec2(420,220));
this->addchild(sp6);
sp6->setblendfunc(blendfunc::disable);
測試結果如下:
如果設定了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)和綠色(0, 1, 0)相加得到(1, 1, 0),結果為黃色。
注意: 所 謂源顏色和目標顏色,是跟繪製的順序有關的。假如先繪製了乙個紅色的物體,再在其上繪製綠色的物體。則綠色是源顏色,紅色是目標顏色。如果順序反過來,則 紅色就是源顏色,綠色才是目標顏色。在繪製時,應該注意順序,使得繪製的源顏色與設定的源因子對應,目標顏色與設定的目標因子對應。不要被混亂的順序搞暈。
cocos2d x 顏色混合
在遊戲開發中,如果我們需要實現閃光的燈,照明彈效果等等,我麼你可以採用混合模式來實現。如果學習過opengl es 就知道裡面使用glblendfunc函式實現的。在cocos2d x裡肯定也有,對於精靈,可以使用mysprite setblendfunc 來現。什麼是顏色混合?簡單來說就是將rgb...
cocos2d x顏色混合模式完成光照效果
使用cocosd x3.2的顏色混合功能和裁剪功能完成光照效果,簡單易用,效果圖如下 底圖,光照圖 一般是有透明度的白色圖 光移動的時間,迴圈次數 node helloworld createflashnode const std string spname,const std string spl...
cocos2d x 混合模式
在opengl es 使用glblendfunc函式實現實現混合模式,cocos2d x中可以使用blendfunc。什麼是顏色混合?簡單來說就是將rgba中的a,經行操作處理。具體一點,就是把某一畫素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。opengl 會把源顏...