日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2dx系列--颜色混合BlendFunc

發(fā)布時間:2023/12/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2dx系列--颜色混合BlendFunc 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、概念
? ? “混合”是指兩種顏色的疊加方式。在新圖片將要渲染畫到屏幕上的時候,將用在新圖片中的紅、綠、藍(lán)和透明度信息,與屏幕上已經(jīng)存在的圖片顏色信息相融合。
? ? 說的具體一點,就是把某一像素位置上原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現(xiàn)特殊的效果。
? ? 新圖片顏色被稱作“源顏色”,而屏幕上已存在的圖片顏色則被稱作“目標(biāo)顏色”。
? ? OpenGL會把源顏色和目標(biāo)顏色各自取出,并乘以一個系數(shù)(源顏色乘以的系數(shù)稱為“源因子”,目標(biāo)顏色乘以的系數(shù)稱為“目標(biāo)因子”),然后相加,這樣就得到了新的顏色。


二、計算公式
? ? 假設(shè):顏色信息的四個分量(紅,綠,藍(lán),透明度)
? ? ? ? (1)“源顏色” ?:(Rs, Gs, Bs, As)
? ? ? ? (2)“目標(biāo)顏色”:(Rd, Gd, Bd, Ad)
? ? ? ? (3)“源因子” ?:(Sr, Sg, Sb, Sa)
? ? ? ? (4)“目標(biāo)因子”:(Dr, Dg, Db, Da)
? ? 那么混合產(chǎn)生的新顏色可以表示為:
? ? ? ??(Rs*Sr + Rd*Dr , Gs*Sg + Gd*Dg , Bs*Sb + Bd*Db , As*Sa + Ad*Da)
? ? 如果顏色的某一分量超過了1.0,則它會被自動截取為1.0,不需要考慮越界的問題。

三、混合因子



GL_ZERO: ? ? 表示使用0.0作為因子,實際上相當(dāng)于不使用這種顏色參與混合運算。
GL_ONE: ? ? ?表示使用1.0作為因子,實際上相當(dāng)于完全的使用了這種顏色參與混合運算。
GL_SRC_ALPHA:表示使用源顏色的alpha值來作為因子。
GL_DST_ALPHA:表示使用目標(biāo)顏色的alpha值來作為因子。
GL_ONE_MINUS_SRC_ALPHA:表示用1.0減去源顏色的alpha值來作為因子。
GL_ONE_MINUS_DST_ALPHA:表示用1.0減去目標(biāo)顏色的alpha值來作為因子。


四、使用方法
? ? Sprite精靈類中有一個設(shè)置混合方式的函數(shù)setBlendFunc(BlendFunc),另外混合方式的屬性值是以BlendFunc結(jié)構(gòu)體作為數(shù)據(jù)的,定義方式為:{ '源因子' , '目標(biāo)因子' }。
? ? 混合方式可用于精靈紋理圖片顏色信息的混合與疊加。
看一下cocos2d-x中BlendFunc的定義,其中有兩個成員src和dst,并定義了幾種默認(rèn)的混合方式。

[cpp]?view plain?copy
  • struct?CC_DLL?BlendFunc??
  • {??
  • ????//!?source?blend?function??
  • ????GLenum?src;??
  • ????//!?destination?blend?function??
  • ????GLenum?dst;??
  • ??
  • ????//!?Blending?disabled.?Uses?{GL_ONE,?GL_ZERO}??
  • ????static?const?BlendFunc?DISABLE;??
  • ????//!?Blending?enabled?for?textures?with?Alpha?premultiplied.?Uses?{GL_ONE,?GL_ONE_MINUS_SRC_ALPHA}??
  • ????static?const?BlendFunc?ALPHA_PREMULTIPLIED;??
  • ????//!?Blending?enabled?for?textures?with?Alpha?NON?premultiplied.?Uses?{GL_SRC_ALPHA,?GL_ONE_MINUS_SRC_ALPHA}??
  • ????static?const?BlendFunc?ALPHA_NON_PREMULTIPLIED;??
  • ????//!?Enables?Additive?blending.?Uses?{GL_SRC_ALPHA,?GL_ONE}??
  • ????static?const?BlendFunc?ADDITIVE;??
  • ??
  • ????bool?operator==(const?BlendFunc?&a)?const??
  • ????{??
  • ????????return?src?==?a.src?&&?dst?==?a.dst;??
  • ????}??
  • ??
  • ????bool?operator!=(const?BlendFunc?&a)?const??
  • ????{??
  • ????????return?src?!=?a.src?||?dst?!=?a.dst;??
  • ????}??
  • ??
  • ????bool?operator<(const?BlendFunc?&a)?const??
  • ????{??
  • ????????return?src?<?a.src?||?(src?==?a.src?&&?dst?<?a.dst);??
  • ????}??
  • };??

  • 代碼測試如下:

    [cpp]?view plain?copy
  • //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?=?{?GL_SRC_ALPHA?,?GL_ONE?};??
  • ????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?=?{GL_ZERO,?GL_ONE};??
  • ????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);??

  • 測試結(jié)果如下:




    如果設(shè)置了glBlendFunc(GL_ONE, GL_ZERO);,則表示完全使用源顏色,完全不使用目標(biāo)顏色,因此畫面效果和不使用混合的時候一致(當(dāng)然效率可能會低一點點)。如果沒有設(shè)置源因子和目標(biāo)因子,則默認(rèn)情況就是這樣的設(shè)置。 如果設(shè)置了glBlendFunc(GL_ZERO, GL_ONE);,則表示完全不使用源顏色,因此無論你想畫什么,最后都不會被畫上去了。(但這并不是說這樣設(shè)置就沒有用,有些時候可能有特殊用途) 如 果設(shè)置了glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);,則表示源顏色乘以自身的alpha 值,目標(biāo)顏色乘以1.0減去源顏色的alpha值,這樣一來,源顏色的alpha值越大,則產(chǎn)生的新顏色中源顏色所占比例就越大,而目標(biāo)顏色所占比例則減 小。這種情況下,我們可以簡單的將源顏色的alpha值理解為“不透明度”。這也是混合時最常用的方式。 如果設(shè)置了glBlendFunc(GL_ONE, GL_ONE);,則表示完全使用源顏色和目標(biāo)顏色,最終的顏色實際上就是兩種顏色的簡單相加。例如紅色(1, 0, 0)和綠色(0, 1, 0)相加得到(1, 1, 0),結(jié)果為黃色。


    注意: 所 謂源顏色和目標(biāo)顏色,是跟繪制的順序有關(guān)的。假如先繪制了一個紅色的物體,再在其上繪制綠色的物體。則綠色是源顏色,紅色是目標(biāo)顏色。如果順序反過來,則 紅色就是源顏色,綠色才是目標(biāo)顏色。在繪制時,應(yīng)該注意順序,使得繪制的源顏色與設(shè)置的源因子對應(yīng),目標(biāo)顏色與設(shè)置的目標(biāo)因子對應(yīng)。不要被混亂的順序搞暈。


    總結(jié)

    以上是生活随笔為你收集整理的cocos2dx系列--颜色混合BlendFunc的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。