cocos2dx系列 顏色混合BlendFunc

2021-07-10 22:34:46 字數 3613 閱讀 8678

一、概念

「混合」是指兩種顏色的疊加方式。在新將要渲染畫到螢幕上的時候,將用在新中的紅、綠、藍和透明度資訊,與螢幕上已經存在的顏色資訊相融合。

說的具體一點,就是把某一畫素位置上原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。

新顏色被稱作「源顏色」,而螢幕上已存在的顏色則被稱作「目標顏色」。

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 會把源顏...