cocos2dx混合模式應用———制作新手引導高亮區域 (2.2.0)


cocos2dx混合模式應用———制作新手引導高亮區域

轉自:http://www.cnblogs.com/mrblue/p/3455775.html 

首先,效果預覽一下

 

高亮區域的圖片:

 

示例代碼:

//.h
void setHighlightRect(const cocos2d::CCRect& rect);
CCRenderTexture*            m_pTarget;


//.cpp
#include "HelloWorldScene.h"
bool HelloWorld::init() { bool bRet = false; do { CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); m_pTarget = CCRenderTexture::create(visibleSize.width, visibleSize.height, kCCTexture2DPixelFormat_RGBA8888); m_pTarget->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2)); addChild(m_pTarget, 10000); setHighlightRect(CCRectMake(100,100,150,50)); bRet = true; } while (0); return bRet; } void HelloWorld::setHighlightRect( const cocos2d::CCRect& rect ) { CCSprite* pMask = CCSprite::create("scrollviewbg.png"); pMask->setPosition(ccp(rect.origin.x,rect.origin.y)); pMask->setAnchorPoint(ccp(0,0)); pMask->setScaleX(rect.size.width/pMask->getContentSize().width); pMask->setScaleY(rect.size.height/pMask->getContentSize().height); ccBlendFunc blend; blend.src = GL_ZERO; blend.dst = GL_ONE_MINUS_SRC_ALPHA; pMask->setBlendFunc(blend); m_pTarget->clear(0,0,0,0.8f); m_pTarget->begin(); pMask->visit(); m_pTarget->end(); }

 

 

下面這段解析摘自:http://www.cnblogs.com/yujunyong/archive/2011/04/13/2015467.html

glBlendFunc();--混合

OpenGL 會把源顏色和目標顏色各自取出,並乘以一個系數(源顏色乘以的系數稱為“源因子”,目標顏色乘以的系數稱為“目標因子”),然后相加,這樣就得到了新的顏 色。(也可以不是相加,新版本的OpenGL可以設置運算方式,包括加、減、取兩者中較大的、取兩者中較小的、邏輯運算等,但我們這里為了簡單起見,不討 論這個了) 下面用數學公式來表達一下這個運算方式。假設源顏色的四個分量(指紅色,綠色,藍色,alpha值)是(Rs, Gs, Bs, As),目標顏色的四個分量是(Rd, Gd, Bd, Ad),又設源因子為(Sr, Sg, Sb, Sa),目標因子為(Dr, Dg, Db, Da)。則混合產生的新顏色可以表示為: (Rs*Sr+Rd*Dr, Gs*Sg+Gd*Dg, Bs*Sb+Bd*Db, As*Sa+Ad*Da) 當然了,如果顏色的某一分量超過了1.0,則它會被自動截取為1.0,不需要考慮越界的問題。

源因子和目標因子是可以通過glBlendFunc函數來進行設置的。glBlendFunc有兩個參數,前者表示源因子,后者表示目標因子。這兩個參數可以是多種值,下面介紹比較常用的幾種。

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值來作為因子。 除此以外,還有GL_SRC_COLOR(把源顏色的四個分量分別作為因子的四個分量)、GL_ONE_MINUS_SRC_COLOR、 GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等,前兩個在OpenGL舊版本中只能用於設置目標因子,后兩個在OpenGL 舊版本中只能用於設置源因子。新版本的OpenGL則沒有這個限制,並且支持新的GL_CONST_COLOR(設定一種常數顏色,將其四個分量分別作為 因子的四個分量)、GL_ONE_MINUS_CONST_COLOR、GL_CONST_ALPHA、 GL_ONE_MINUS_CONST_ALPHA。另外還有GL_SRC_ALPHA_SATURATE。新版本的OpenGL還允許顏色的alpha 值和RGB值采用不同的混合因子。

 

舉例來說: 如果設置了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),結果為黃色。

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM