cocos2dx系列--顏色混合BlendFunc
阿新 • • 發佈:2019-02-15
(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 { //! 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); } };
//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);
測試結果如下: